2010-09-15 21 views
13

Come si aggiunge una cartella (ad esempio una cartella di risorse contenente arti) al classpath di un progetto netbeans? Sono riuscito a farlo manualmente modificando il file jar generato NB del progetto (che è il suo file MANIFEST.MF + copiando le risorse manualmente), ma ci dovrebbe essere anche un modo per dire a netbeans di occuparsi delle risorse, no?Come aggiungere risorse al classpath

struttura La cartella si presenta così:

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

Non voglio per confezionare l'arte dentro il barattolo, perché mi piacerebbe l'arte per essere facilmente sostituibile. Se aggiungo la cartella artistica alla cartella src, NB compila bene, ma le risorse artistiche finiscono nel barattolo.

L'aggiunta della cartella art alle librerie di progetto netbeans (Proprietà -> Librerie -> Aggiungi JAR/Cartella) sembrava non funzionare, perché poi ho finito con un errore '... \ project \ art è una directory o non può essere letto Non copiare le librerie. ' che a sua volta impedisce la copia della cartella delle librerie reali.

Qualche idea?

migliori saluti Chris

2 osservazioni fatte, sulla base dei commenti da gpeche: a) specificando Piuttosto la cartella risorse aggiuntive nella scheda "Run" che nella scheda "Compila" delle proprietà del progetto - > Le librerie non sembrano fare molta differenza in Netbeans (attualmente sto usando 6.9.1). L'uscita (e quindi l'errore) rimane lo stesso, vale a dire nulla viene copiato a tutti:

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 altro aspetto interessante è che nel menu di aiuto del pannello Biblioteche nulla menzionato in modo esplicito per quanto riguarda le cartelle come librerie. Potrebbe essere possibile che il pulsante in Netbeans sia chiamato in modo errato, che solo i veri jar siano consentiti?

b) L'aggiunta della cartella delle risorse all'elenco Librerie ha tuttavia l'impatto, per aggiungere un'altra voce a MANIFEST.MF. Mentre - e questo è il problema più piccolo - la voce classpath sembra aspettarsi sempre che la cartella delle risorse sia una sottocartella della cartella della libreria (ad esempio "lib/arts") il problema principale è che sembra esserci una barra mancante. Come accennato, la voce generata da NB in ​​MANIFEST.MF sarà simile a questa "lib/arts" (che non funziona per me), mentre (impostata manualmente) "lib/arts /" fa ?!

Il modo in cui utilizziamo le risorse dalla cartella è qualcosa di simile:

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

Edit:

Sulla base Tushars commento e this posting ho trovato la seguente soluzione per essere un compromesso accettabile tra funzionalità e conforto.

Sovrascrivo la destinazione ANT dal file 'build-impl.xml' generato automaticamente che crea il Percorso di classe nel file MANIFEST.MF nel file 'build.xml' di base del progetto Netbeans. Il codice che va al file 'build.xml' si presenta così:

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

Il compromesso è che per lo sviluppo in Netbeans ho ancora per aggiungere la cartella delle risorse (ad esempio 'arte') per le librerie a elencare eseguire il progetto in Netbeans. Ciò causerà una voce aggiuntiva nel MANIFEST.file di MF ('lib/arte') insieme con l'effetto che le librerie non vengono automaticamente copiati nella cartella 'dist', con il messaggio

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

Questo behavor è - per quanto ne so - destinato (per forzare tutto per essere raggruppato in un barattolo), anche se ci sono discussioni su di esso in corso. Per creare un vero pacchetto di distribuzione dovrei portare via le cartelle delle risorse dall'elenco delle librerie in NB e ricostruire.

Le idee su una configurazione più snella senza alcun compromesso sono ovviamente ancora benvenute. :)

risposta

12
  1. Aggiunta cartella delle risorse al percorso di classe:

    Quando si Clean- & -Costruire un progetto basato NetBeans Ant viene creato un file MANIFEST.MF nella directory principale del progetto. Questo file viene incluso anche nel file JAR. Modificare questo file e aggiungere la voce come segue:

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

    barra è importante dopo arti nel percorso di classe.

  2. Compresa la cartella delle risorse arti nella distribuzione

    copiare questa cartella nella cartella dist dopo la costruzione o aggiungere un target ANT per copiare le risorse necessarie nella cartella dist.

    Aggiungere il bersaglio come la seguente nel file build.xml:

    <target name="-post-jar"> 
        <mkdir dir="${dist.dir}/resources"/> 
        <copy todir="${dist.dir}/resources"> 
         <fileset dir="${basedir}/resources" /> 
        </copy> 
    </target> 
    
  3. codice per accedere a tali risorse:

    il codice necessario per accedere a tali file di risorse sono i seguenti: (Questo non funzionerà in fase di progettazione ma sicuramente dal file JAR)

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

    NOTA: i file manifest.mf e build.xml si trova nella directory principale del progetto sono accessibili dal pannello File in NetBeans IDE

+0

1) aggiungendo qualcosa al file di progetto MANIFEST.MF NB (che è la classe-Path in questo caso) sembra ignorare qualsiasi altra cosa che altrimenti andare lì (ad esempio, il altre librerie aggiunte al progetto). Qualche idea su come ripristinare anche il percorso originale? Ad esempio, le librerie stesse verrebbero copiate. 3) per me non funziona senza la barra principale - devo aggiungere quella barra, quindi funziona. – ChristianS

+0

Vorrei suggerire prima di generare il manifest.mf da build NetBeans e quindi utilizzare quei valori di percorso di classe predefiniti più i percorsi di directory aggiuntivi aggiunti. –

+0

Si prega inoltre di aggiungere guida su come escludere le risorse della cartella, quindi non sarà incluso nel .jar – GusDeCooL

1

Al fine di rimuovere il lib/arte dal Class-Path e non ottenere "è una directory o non può essere letto" bisogno di cancellare lib/arte dal percorso:

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

Utilizzando NetBeans 8.0.2:

  1. Fare clic con il progetto.
  2. Seleziona Proprietà.
  3. Selezionare Fonti.
  4. Fare clic su Aggiungi cartella per le cartelle del pacchetto sorgente .
  5. Selezionare la directory in cui si trovano le risorse.
  6. Fare clic su Aprire sul nome della directory.
  7. Fare clic su OK per chiudere la finestra di dialogo Proprietà progetto.

Le risorse vengono aggiunte al progetto.

Vedrete la directory aggiunto nel riquadro Navigazione e

Nella altro progetto, le risorse sono ora disponibili. Ad esempio, per leggere un'immagine:

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