Ok, vì vậy, đây là những gì chúng tôi có:Bao gồm các thư viện trong jar
Chúng tôi có hai gói thư viện mà chúng tôi đã biên dịch thành các lọ.
package starwars; public class JarJar { public void JarSayHello() { System.out.println("Jaaaaar!!"); } }
package barwars; public class BarBar { public void BarSayHello() { System.out.println("Baaaaa!!"); } }
Chúng tôi biên dịch này với
javac -d bin -sourcepath src src/barwars/BarBar.java jar cvf barwars.jar -C bin .
và
javac -d bin -sourcepath src src/starwars/JarJar.java jar cvf starwars.jar -C bin .
Tất cả độc đáo vào lọ cho chúng ta.
Bây giờ, chúng tôi muốn bao gồm hai lọ này vào một dự án java khác.
vì vậy chúng tôi đã có
- /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
Bây giờ chúng ta biên dịch này với:
javac -d bin -sourcepath src -cp "libs/starwars.jar;libs/*" src/a_pack/HelloWorld.java jar cvfm helloworld.jar manifest.txt -C bin .
Và đây biên dịch và chạy tốt.
Bây giờ tôi có hai vấn đề.
Thứ nhất - nếu tôi di chuyển file jar này đến một nơi khác, và cố gắng chạy nó, sau đó tôi sẽ nhận được:
Exception in thread "main" java.lang.NoClassDefFoundError: starwars/JarJar
Bây giờ tôi có thể sửa lỗi này bằng cách di chuyển các thư mục libs để bất cứ nơi nào tôi di chuyển cái bình. Nhưng điều này đánh tôi như lộn xộn (nếu có thư mục libs ở địa điểm đó thì sao?).
Lý tưởng nhất là những gì tôi muốn làm, bao gồm các lọ được tham chiếu bên trong bình, vì vậy có một bình chứa mọi thứ cần thiết để chạy bên trong chính nó.
Điều này có khả thi không? (Và đó là thực hành tốt?)
Bạn có thể muốn xem xét cách Maven giải quyết vấn đề này. –