2013-05-27 10 views
6

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

+2

Może chcesz sprawdzić, jak Maven rozwiązuje ten problem. –

Odpowiedz

7

Możliwe, tak. Dobra praktyka, nie.

Słoiki są po prostu plikami zip, dzięki czemu można rozpakować i zeskładować zawartość do serca. Większym problemem jest zarządzanie wszystkimi tymi oddzielnymi słoikami, gdy twój projekt staje się większy.

Większość projektów nie kompiluje się za pomocą wiersza poleceń. Zamiast tego IDE utrzymuje twoje słoiki na bieżąco. Większość nowoczesnych projektów Java wykorzystuje Mavena lub Ivy do umieszczania słoi w repozytorium i wyławiania ich w razie potrzeby.

Zobacz Eclipse, Netbeans lub Intellij dla IDE. I spójrz na Mavena, aby zbudować swój projekt.

+0

Dzięki za wpis, będę o tym pamiętać. – dwjohnston

+0

Jeśli to możliwe, w jaki sposób? Wiem o Zaćmieniu i innych IDE, ale w tej chwili próbuję utworzyć pojedynczy gruby plik .jar wewnątrz obrazka w doku z minimalnymi zależnościami. Biorąc pod uwagę, że istnieje 'helloworld.jar' i pęczek zewnętrznych słoików w' libs/', co napisałbyś w terminalu, aby uzyskać' helloworldwithdeps.jar'? –

+0

Znowu skonstruuj swój projekt za pomocą Mavena, a następnie spójrz na projekt Apache Shade, aby utworzyć słoik uber. – ccleve