OK, więc oto co mamy:Łącznie z bibliotekami w słoju
Mamy dwa pakiety biblioteczne, które skompilowaliśmy w słoiki.
package starwars; public class JarJar { public void JarSayHello() { System.out.println("Jaaaaar!!"); } }
package barwars; public class BarBar { public void BarSayHello() { System.out.println("Baaaaa!!"); } }
Tworzymy je z
javac -d bin -sourcepath src src/barwars/BarBar.java jar cvf barwars.jar -C bin .
i
javac -d bin -sourcepath src src/starwars/JarJar.java jar cvf starwars.jar -C bin .
Wszystko ładnie do słoików dla nas.
Teraz chcemy włączyć te dwa słoiki do innego projektu Java.
więc mamy
- /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
Teraz skompilować to z:
javac -d bin -sourcepath src -cp "libs/starwars.jar;libs/*" src/a_pack/HelloWorld.java jar cvfm helloworld.jar manifest.txt -C bin .
I to kompiluje i działa poprawnie.
Teraz mam dwa problemy.
pierwsze - czy mogę przenieść ten plik jar gdzieś indziej, i spróbuj uruchomić go, a następnie Wezmę:
Exception in thread "main" java.lang.NoClassDefFoundError: starwars/JarJar
Teraz mogę to naprawić, przenosząc folder libs gdziekolwiek przenieść słoik. Ale to wydaje mi się kłopotliwe (a co, jeśli w tej lokalizacji jest już folder biblioteki?).
Idealnie, co chciałbym zrobić, to słoiki z odnośnikami w słoiku, więc jest jeden słoik, który zawiera wszystko, co jest wymagane do uruchomienia w sobie.
Czy to możliwe? (A czy to dobra praktyka?)
Może chcesz sprawdzić, jak Maven rozwiązuje ten problem. –