Итак, вот что у нас есть:В том числе библиотеки в банке
У нас есть два библиотечных пакета, которые мы собрали в банки.
package starwars; public class JarJar { public void JarSayHello() { System.out.println("Jaaaaar!!"); } }
package barwars; public class BarBar { public void BarSayHello() { System.out.println("Baaaaa!!"); } }
Мы компилировать их с
javac -d bin -sourcepath src src/barwars/BarBar.java jar cvf barwars.jar -C bin .
и
javac -d bin -sourcepath src src/starwars/JarJar.java jar cvf starwars.jar -C bin .
Все хорошо в банки для нас.
Теперь мы хотим включить эти два баночки в другой проект java.
поэтому мы получили
- /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
Сейчас мы составляем это с:
javac -d bin -sourcepath src -cp "libs/starwars.jar;libs/*" src/a_pack/HelloWorld.java jar cvfm helloworld.jar manifest.txt -C bin .
И это компилируется и работает нормально.
Теперь у меня есть две проблемы.
Во-первых - если я перейду эту банку файл в другое место и попробуйте запустить его, то я получаю:
Exception in thread "main" java.lang.NoClassDefFoundError: starwars/JarJar
Теперь я могу это исправить, перемещая папку ЛИЭС туда, куда я двигаюсь банку. Но это кажется мне бесполезным (что, если в этом месте уже есть папка libs?).
Идеально то, что я хотел бы сделать, включает упоминаемые банки в банке, так что есть одна банка, которая содержит все, что требуется для запуска внутри себя.
Возможно ли это? (И это хорошая практика?)
Возможно, вы захотите изучить, как Maven решает это. –