Ok, ecco cosa abbiamo:Comprese le librerie nel barattolo
Abbiamo due pacchetti di librerie, che abbiamo compilato in barattoli.
package starwars; public class JarJar { public void JarSayHello() { System.out.println("Jaaaaar!!"); } }
package barwars; public class BarBar { public void BarSayHello() { System.out.println("Baaaaa!!"); } }
compiliamo questi con
javac -d bin -sourcepath src src/barwars/BarBar.java jar cvf barwars.jar -C bin .
e
javac -d bin -sourcepath src src/starwars/JarJar.java jar cvf starwars.jar -C bin .
Tutto bene in vasi per noi.
Ora vogliamo includere questi due vasi in un altro progetto java.
Quindi abbiamo
- /project/src/a_pack/HelloWorld.java
- /project/libs/starwars.jar
- /project/libs/barwars.jar
- /project/manifest.txt
package a_pack; import starwars.JarJar; import barwars.BarBar; public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World"); JarJar myJar = new JarJar(); myJar.JarSayHello(); BarBar myBar = new BarBar(); myBar.BarSayHello(); } }
Manifest.txt
Main-Class: a_pack.HelloWorld Class-Path: libs/starwars.jar libs/barwars.jar
Ora compiliamo questo con:
javac -d bin -sourcepath src -cp "libs/starwars.jar;libs/*" src/a_pack/HelloWorld.java jar cvfm helloworld.jar manifest.txt -C bin .
E questo compila e funziona bene.
Ora ho due problemi.
In primo luogo - se sposto questo file jar da qualche altra parte, e provo eseguirlo, allora vado a prendere:
Exception in thread "main" java.lang.NoClassDefFoundError: starwars/JarJar
Ora posso risolvere il problema spostando la cartella libs ovunque mi muovo il vaso. Ma questo mi sembra un po 'disordinato (e se ci fosse già una cartella libs in quella posizione?).
Idealmente, quello che mi piacerebbe fare è includere i barattoli di riferimento all'interno del barattolo, quindi c'è un barattolo che contiene tutto ciò che è necessario eseguire all'interno di sé.
È possibile? (Ed è una buona pratica?)
Si potrebbe voler esaminare come Maven risolve questo. –