Wie das hinzufügen von Ressourcen zu classpath

Wie fügen Sie einen Ordner (z.B. eine Ressource Ordner mit Kunst) zu den classpath ein netbeans-Projekt? Ich schaffte es zu tun manuell über die Bearbeitung der NB erzeugten jar-Datei des Projekts (das ist Ihr MANIFEST.MF-Datei + kopieren Sie die Ressourcen manuell), aber es sollte ein Weg, zu sagen, netbeans, aber auch in den Sinn, die Ressourcen, nicht?

Die Ordner Struktur sieht wie folgt aus:

/project/art/
/project/dist/lib/
/project/dist/art/
/project/dist/project.jar
/project/lib/
/project/src/

Ich nicht wollen, Verpacken Sie die Kunst in der jar, weil ich möchte die Kunst an sich leicht austauschbar. Wenn ich den clipart-Ordner in den src-Ordner dann NB kompiliert in Ordnung, aber die art Ressourcen am Ende in das Glas.

Hinzufügen den clipart-Ordner auf der netbeans-Projekt-Bibliotheken (Eigenschaften -> Bibliotheken -> Add JAR/Folder) schien nicht zu funktionieren, weil ich dann am Ende mit einer Fehlermeldung " ...\Projekt\Kunst ist ein Verzeichnis, oder kann nicht gelesen werden. Nicht kopieren der Bibliotheken.', was wiederum verhindert, dass auch die echten Ordner "libraries" kopiert werden.

Irgendwelche Ideen?

Beste Grüße
Chris

2 Beobachtungen gemacht, basierend auf die Kommentare von gpeche:
a) Eher die Angabe der zusätzlichen Mittel, die Ordner in die "Run" - tab als in der "Compile" - tab des Projekt-Eigenschaften -> Bibliotheken scheint nicht zu einen großen Unterschied machen Sie in Netbeans (ich bin derzeit mit 6.9.1). Die Ausgabe (und damit Fehler) bleibt der gleiche, das ist nichts kopiert wird:

Created dir: C:\Users\Chrisi\Desktop\vocabulary\VocabularyTrainer\dist
C:\Users\Chrisi\Desktop\vocabulary\VocabularyTrainer\art is a directory or can't be read. Not copying the libraries.
Not copying the libraries.
Building jar: C:\Users\Chrisi\Desktop\vocabulary\VocabularyTrainer\dist\VocabularyTrainer.jar

Ein weiterer interessanter Aspekt ist, dass im Hilfe-Menü der Bibliotheken-panel nichts explizit erwähnt, bezüglich der Ordner als Bibliotheken. Könnte es möglich sein, dass der button in Netbeans ist falsch benannt, das ist nur echte jar ' s sind erlaubt?

b) Hinzufügen der Ressourcen-Ordner zu den Bibliotheken, die Liste hat das Auswirkungen, wenn man einen weiteren Eintrag hinzufügen, um das MANIFEST.MF. Während - und das ist das kleinere Problem - die classpath-Eintrag scheint zu sein, immer in der Erwartung, den resource-Ordner, um einen Unterordner des library-Ordners (z.B. "lib/Kunst"), das große problem ist, dass es scheint zu sein, ein slash fehlt.
Wie bereits erwähnt die NB erzeugt Eintrag im MANIFEST.MF wird wie folgt Aussehen "lib/Kunst" (was bei mir nicht funktioniert), während (manuell gesetzt) "lib/Kunst/"?!

Die Art, wie ich die Ressourcen aus dem Ordner ist so etwas wie dieses:

URL resource = getClass().getResource("/gui/refresh.png");
ImageIcon tmp = new ImageIcon(resource);

Edit:

Basierend auf Tushars Kommentar und dieses posting ich die folgende Lösung gefunden werden, die einen akzeptablen Kompromiss zwischen Funktionalität und Komfort.

Ich überschreiben Sie das ANT-target aus dem auto-generiert 'build-impl.xml' Datei wird erstellt, und der Class-Path in der MANIFEST.MF-Datei im basic 'build.xml' Datei von der Netbeans-Projekt. Der code der geht an die 'build.xml' Datei sieht wie folgt aus:

  <property name="art.classpath" value="art/" />

  <target name="-post-jar">
    <mkdir dir="${dist.dir}/art"/>
    <copy todir="${dist.dir}/art">
      <fileset dir="${basedir}/art">
        <!-- <exclude name="**/!source/**"/> if you want to exclude something... -->
      </fileset>
    </copy>
  </target>

  <target name="-init-macrodef-copylibs">
    <macrodef name="copylibs" uri="http://www.netbeans.org/ns/j2se-project/3">
      <element name="customize" optional="true"/>
      <sequential>
        <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
        <pathconvert property="run.classpath.without.build.classes.dir">
          <path path="${run.classpath}"/>
          <map from="${build.classes.dir.resolved}" to=""/>
        </pathconvert>
        <pathconvert pathsep=" " property="jar.classpath">
          <path path="${run.classpath.without.build.classes.dir}"/>
          <chainedmapper>
            <flattenmapper/>
            <globmapper from="*" to="lib/*"/>
          </chainedmapper>
        </pathconvert>
        <taskdef classname="org.netbeans.modules.java.j2seproject.copylibstask.CopyLibs" classpath="${libs.CopyLibs.classpath}" name="copylibs"/>
        <copylibs compress="${jar.compress}" index="${jar.index}" jarfile="${dist.jar}" manifest="${manifest.file}" runtimeclasspath="${run.classpath.without.build.classes.dir}">
          <fileset dir="${build.classes.dir}"/>
          <manifest>
            <attribute name="Class-Path" value="${jar.classpath} ${art.classpath}"/>
            <customize/>
          </manifest>
        </copylibs>
      </sequential>
    </macrodef>
  </target>

Der Nachteil ist, dass für die Entwicklung in Netbeans habe ich noch die Ressource-Ordner (z.B. 'Kunst') zu den Bibliotheken, die Liste zu machen, das Projekt in Netbeans. Dadurch wird ein zusätzlicher Eintrag in der MANIFEST.MF-Datei ('lib/Kunst'), zusammen mit der Wirkung, dass die Bibliotheken werden nicht automatisch kopiert, um den "dist" Ordner, mit der Meldung

...\art is a directory or can't be read. Not copying the libraries.
Not copying the libraries.

Diese behavor ist - afaik - bestimmt (Kraft, alles gebündelt in einem Glas), obwohl es Diskussionen darüber gehen weiter. Um eine echte Verteilung bundle würd ich nehmen entfernt die Ressource(N) Ordner aus der library-Liste in NB und neu erstellen.

Ideen zu einem strafferen setup ohne Kompromisse sind natürlich immer noch willkommen. 🙂

InformationsquelleAutor der Frage ChristianS | 2010-09-15

Schreibe einen Kommentar