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. :)
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
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. –
Si prega inoltre di aggiungere guida su come escludere le risorse della cartella, quindi non sarà incluso nel .jar – GusDeCooL