2013-05-27 5 views
6

Итак, вот что у нас есть:В том числе библиотеки в банке

У нас есть два библиотечных пакета, которые мы собрали в банки.

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

Идеально то, что я хотел бы сделать, включает упоминаемые банки в банке, так что есть одна банка, которая содержит все, что требуется для запуска внутри себя.

Возможно ли это? (И это хорошая практика?)

+2

Возможно, вы захотите изучить, как Maven решает это. –

ответ

7

Возможно, да. Хорошая практика, нет.

Jars - это только ZIP-файлы, поэтому вы можете разархивировать и конвертировать содержимое вашего сердца. Большая проблема заключается в управлении всеми этими отдельными банками, поскольку ваш проект становится больше.

Большинство проектов не скомпилируются с использованием командной строки. Вместо этого среда IDE сохраняет ваши банки в актуальном состоянии. И большинство современных Java-проектов используют Maven или Ivy для размещения банок в репозитории и вырывают их по мере необходимости.

Посмотрите на Eclipse, Netbeans или Intellij для IDE. И загляните в Maven для структурирования вашего проекта.

+0

Спасибо за сообщение, я буду помнить об этом. – dwjohnston

+0

Если возможно, как? Я знаю об затмении и других IDE, но прямо сейчас я пытаюсь создать единый жирный файл .jar внутри изображения докеров с минимальными зависимостями. Учитывая, что есть 'helloworld.jar' и куча внешних банок в' libs/', что бы написать в терминале, чтобы получить' helloworldwithdeps.jar'? –

+0

Снова структурируйте свой проект с помощью Maven, а затем посмотрите проект Apache Shade, чтобы создать банку uber. – ccleve

Смежные вопросы