2013-05-27 41 views
6

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 . 

 
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?)

+2

Bạn có thể muốn xem xét cách Maven giải quyết vấn đề này. –

Trả lời

7

Có thể, có. Thực hành tốt, không.

Chum chỉ là các tệp zip, vì vậy bạn có thể giải nén và giải nén vào nội dung trái tim của mình. Vấn đề lớn hơn là quản lý tất cả các lọ riêng biệt này khi dự án của bạn lớn hơn.

Hầu hết các dự án không biên dịch bằng dòng lệnh. Thay vào đó, một IDE giữ cho các lọ của bạn được cập nhật. Và hầu hết các dự án Java hiện đại đều sử dụng Maven hoặc Ivy để đặt các lọ vào một kho và cá chúng ra khi cần thiết.

Xem Eclipse, Netbeans hoặc Intellij cho IDE. Và nhìn vào Maven để cấu trúc dự án của bạn.

+0

Cảm ơn bài đăng của bạn, tôi sẽ ghi nhớ điều đó. – dwjohnston

+0

Nếu có thể, làm cách nào? Tôi biết về nhật thực và các IDE khác, nhưng ngay tại thời điểm này, tôi đang cố gắng tạo một tệp .jar đơn lẻ bên trong một hình ảnh docker với các phụ thuộc tối thiểu. Cho rằng có 'helloworld.jar' và một loạt các jars bên ngoài trong' libs/', cái nào sẽ viết trong terminal để lấy' helloworldwithdeps.jar'? –

+0

Một lần nữa, cấu trúc dự án của bạn bằng Maven, sau đó hãy xem dự án Apache Shade để tạo ra một bình uber. – ccleve

Các vấn đề liên quan