Wie man Ressourcen zum Klassenpfad hinzufügt

Wie fügen Sie dem Klassenpfad eines NetBeans-Projekts einen Ordner hinzu (z. B. einen Ressourcenordner mit Kunst)? Ich habe es manuell geschafft, indem ich die von NB generierte JAR-Datei des Projekts bearbeitet habe (das ist die MANIFEST.MF-Datei + manuelles Kopieren der Ressourcen), aber es sollte eine Möglichkeit geben, Netbeans auch zu sagen, dass die Ressourcen berücksichtigt werden sollen, nein?

Die Ordnerstruktur sieht folgendermaßen aus:

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

Ich möchte die Kunst nicht in das Glas packen, weil ich möchte, dass sie leicht austauschbar ist. Wenn ich den art-Ordner zum src-Ordner hinzufüge, wird NB gut kompiliert, aber die art-Ressourcen landen im jar.

Das Hinzufügen des Art-Ordners zu den NetBeans-Projektbibliotheken (Eigenschaften -> Bibliotheken -> JAR / Ordner hinzufügen) schien nicht zu funktionieren, da dann der Fehler "... \ project \ art ist ein Verzeichnis oder kann nicht gelesen werden. Die Bibliotheken nicht kopieren. ' Dies wiederum verhindert, dass auch der Ordner mit den echten Bibliotheken kopiert wird.

Irgendwelche Ideen

it freundlichen Grüßen Chr

2 Beobachtungen basierend auf den Kommentaren von gpeche: a) Die Angabe des zusätzlichen Ressourcenordners in der Registerkarte "Ausführen" als in der Registerkarte "Kompilieren" der Projekteigenschaften -> Bibliotheken scheint keinen großen Unterschied zu machen in Netbeans (ich verwende derzeit 6.9.1). Die Ausgabe (und damit der Fehler) bleibt gleich, dh es wird überhaupt nichts kopiert:

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 Hilfemenü des Bedienfelds Bibliotheken nichts explizit erwähnt wird, was Ordner als Bibliotheken bezeichnet. Könnte es sein, dass der Button in Netbeans falsch benannt ist, dass nur echte Jars erlaubt sind?

b) Das Hinzufügen des Ressourcenordners zur Bibliotheksliste hat jedoch Auswirkungen auf das Hinzufügen eines weiteren Eintrags zur MANIFEST.MF. Während - und das ist das kleinere Problem - der Klassenpfad-Eintrag immer erwartet, dass der Ressourcenordner ein Unterordner des Bibliotheksordners ist (z. B. "lib / arts"), besteht das Hauptproblem darin, dass ein Schrägstrich fehlt. Wie bereits erwähnt, sieht der von NB generierte Eintrag in der MANIFEST.MF wie folgt aus: "lib / arts" (was bei mir nicht funktioniert), während (manuell gesetzt) "lib / arts /" dies tut?!

Die Art und Weise, wie ich Ressourcen aus dem Ordner verwende, sieht ungefähr so aus:

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

Bearbeiten

Basiert auf Tushars Kommentar unddieses Posting Ich fand die folgende Lösung als akzeptablen Kompromiss zwischen Funktionalität und Komfort.

Ich überschreibe das ANT-Ziel aus der automatisch generierten 'build-impl.xml'-Datei, die den Klassenpfad in der MANIFEST.MF-Datei in der grundlegenden' build.xml'-Datei des Netbeans-Projekts erstellt. Der Code für die Datei 'build.xml' sieht folgendermaßen 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 ich für die Entwicklung in Netbeans noch den Ressourcenordner (z. B. 'art') zur Bibliotheksliste hinzufügen muss, damit das Projekt in Netbeans ausgeführt wird. Dies führt zu einem zusätzlichen Eintrag in der Datei MANIFEST.MF ('lib / art') und dazu, dass die Bibliotheken nicht automatisch in den Ordner 'dist' kopiert werden, mit der Meldung

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

Dieses Verhalten ist - afaik - beabsichtigt (um zu erzwingen, dass alles in einem Glas gebündelt wird), obwohl es Diskussionen darüber gibt. Um ein echtes Distributionspaket zu erstellen, müsste ich die Ressourcenordner aus der Bibliotheksliste in NB entfernen und neu erstellen.

Ideen über ein optimierteres Setup ohne Kompromisse sind natürlich immer noch willkommen. :)

Antworten auf die Frage(6)

Ihre Antwort auf die Frage