web-dev-qa-db-fra.com

Comment ajouter des ressources à classpath

Comment ajouter un dossier (par exemple un dossier de ressources contenant des arts) au chemin de classe d'un projet netbeans? J'ai réussi à le faire manuellement en éditant le NB fichier jar généré du projet (c'est-à-dire son fichier MANIFEST.MF + copie des ressources manuellement), mais il devrait y avoir un moyen de dire aux netbeans que bien à l'esprit les ressources, non?

La structure des dossiers ressemble à ceci:

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

Je ne veux pas emballer l'art dans le pot parce que j'aimerais que l'art soit facilement échangeable. Si j'ajoute le dossier artistique au dossier src alors NB compile très bien, mais les ressources artistiques finissent dans le bocal.

L'ajout du dossier art aux bibliothèques de projet netbeans (Propriétés -> Bibliothèques -> Ajouter JAR/Dossier) ne semblait pas fonctionner, car alors je me suis retrouvé avec une erreur '...\project\art est un répertoire ou ne peut pas être lis. Ne pas copier les bibliothèques. ' ce qui à son tour empêche même la copie du dossier des bibliothèques réelles.

Des idées?

Cordialement, Chris

2 Observations faites, basées sur les commentaires de gpeche: a) Spécifiant plutôt le dossier de ressources supplémentaires dans l'onglet "Exécuter" que dans l'onglet "Compiler" des propriétés du projet -> Les bibliothèques ne semblent pas faire beaucoup de différence dans Netbeans (j'utilise actuellement 6.9.1). La sortie (et donc l'erreur) reste la même, c'est-à-dire que rien n'est copié du tout:

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

Un autre aspect intéressant est que dans le menu d'aide du panneau Bibliothèques, rien n'est explicitement mentionné concernant les dossiers en tant que bibliothèques. Serait-il possible, que le bouton dans Netbeans porte un faux nom, c'est-à-dire que seuls les vrais pots soient autorisés?

b) L'ajout du dossier de ressources à la liste des bibliothèques a cependant pour effet d'ajouter une autre entrée au MANIFEST.MF. Bien que - et c'est le plus petit problème - l'entrée classpath semble toujours s'attendre à ce que le dossier de ressources soit un sous-dossier du dossier de la bibliothèque (par exemple "lib/arts"), le problème majeur est qu'il semble y avoir une barre oblique manquante. Comme mentionné, l'entrée NB générée dans le MANIFEST.MF ressemblera à ceci "lib/arts" (qui ne fonctionne pas pour moi), tandis que (définie manuellement) "lib/arts /" le fait ?!

La façon dont j'utilise les ressources du dossier est quelque chose comme ceci:

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

Modifier:

Sur la base des commentaires de Tushars et cette publication J'ai trouvé la solution suivante comme un compromis acceptable entre fonctionnalité et confort.

Je remplace la cible ANT à partir du fichier 'build-impl.xml' généré automatiquement qui crée le chemin de classe dans le fichier MANIFEST.MF dans le fichier 'build.xml' de base du projet Netbeans. Le code qui va dans le fichier 'build.xml' ressemble à ceci:

  <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>

Le compromis est que pour le développement dans Netbeans, je dois encore ajouter le dossier de ressources (par exemple `` art '') à la liste des bibliothèques pour que le projet s'exécute dans Netbeans. Cela entraînera une entrée supplémentaire dans le fichier MANIFEST.MF ('lib/art') ainsi que l'effet que les bibliothèques ne seront pas automatiquement copiées dans le dossier 'dist', avec le message

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

Ce comportement est - afaik - destiné (à forcer tout à être emballé dans un bocal), même s'il y a des discussions à ce sujet. Pour créer un véritable ensemble de distribution, je devrais retirer le ou les dossiers de ressources de la liste des bibliothèques dans NB et reconstruire.

Les idées sur une configuration plus rationalisée sans compromis sont bien sûr toujours les bienvenues. :)

16
ChristianS
  1. Ajout d'un dossier de ressources au chemin de classe:

    Lorsque vous nettoyez et construisez un projet basé sur Ant NetBeans, il crée un fichier manifest.mf dans le répertoire racine du projet. Ce fichier est également inclus dans le fichier JAR. Modifiez ce fichier et ajoutez une entrée comme suit:

    Manifest-Version: 1.0
    X-COMMENT: Main-Class will be added automatically by build
    Class-Path: arts/  
    

    slash est important après les arts dans le chemin de la classe.

  2. y compris le dossier des ressources artistiques dans la distribution

    Copiez ce dossier dans le dossier dist après la génération ou ajoutez une cible ANT pour copier les ressources requises dans le dossier dist.

    Ajoutez la cible comme suit dans le fichier build.xml:

    <target name="-post-jar">
         <mkdir dir="${dist.dir}/resources"/>
         <copy todir="${dist.dir}/resources">
             <fileset dir="${basedir}/resources" />
         </copy>
     </target>
    
  3. Code pour accéder à ces ressources:

    Le code nécessaire pour accéder à ces fichiers de ressources doit être le suivant: (Cela ne fonctionnera pas au moment de la conception mais sûrement à partir du fichier JAR)

    // pay attention to relative path
    URL resource = ClassLoader.getSystemResource("gui/refresh.png"); 
    ImageIcon tmp = new ImageIcon(resource);
    

    REMARQUE: les fichiers manifest.mf et build.xml situés dans le répertoire racine du projet sont accessibles à partir du panneau Fichiers dans NetBeans IDE

14
Tushar Joshi

Utilisation de NetBeans 8.0.2:

  1. Cliquez avec le bouton droit sur le projet.
  2. Sélectionnez Propriétés.
  3. Sélectionnez Sources.
  4. Cliquez sur Ajouter un dossier pour Dossiers du package source.
  5. Sélectionnez le répertoire dans lequel les ressources existent.
  6. Cliquez sur Ouvrir sur le nom du répertoire.
  7. Cliquez sur OK pour fermer la boîte de dialogue Propriétés du projet.

Les ressources sont ajoutées au projet.

Vous verrez également le répertoire ajouté dans votre volet de navigation

Dans l'autre projet, les ressources sont désormais disponibles. Par exemple, pour lire une image:

BufferedImage zero = ImageIO.read(OCR.class.getResourceAsStream("/0.bmp"));
10
Squiggler

Pour supprimer le lib/art de Class-Path et ne pas obtenir "est un répertoire ou ne peut pas être lu", vous devez supprimer lib/art du chemin:

    <pathconvert property="run.classpath.without.build.classes.dir">
      <path path="${run.classpath}"/>
      <map from="${build.classes.dir.resolved}" to=""/>
      **<map from="${basedir}/art" to=""/> <!-- remove art from lib -->**
    </pathconvert>
1
eml