Объединение JAR-зависимостей с исполняемым JAR (Über JAR) из командной строки - PullRequest
5 голосов
/ 25 июля 2011

Я пытаюсь создать исполняемый файл из командной строки. Основной класс в JAR имеет зависимости, которые я упаковал в другой простой файл JAR.

Я хочу упаковать JAR-файл зависимости вместе с исполняемым JAR-файлом, чтобы в него можно было отправить один JAR-файл.

Пока я пробовал следующее:

Файл зависимостей Hello.class имеет код макета:

public class Hello {
    public String getHello() {
        return "Well hello there!!";
    }
}

Я упаковал файл класса в hello.jar, используя:

jar cvfM hello.jar Hello.class

Содержимое hello.jar теперь:

hello.jar -+- Hello.class

Теперь у меня есть основной класс с пробным кодом:

public class Main {
    public static void main(String[] args) {
        System.out.println(new Hello().getHello());
    }
}

Затем я создаю файл манифеста manifest.txt со следующим содержимым:

Main-Class: Main
Class-Path: hello.jar

Теперь я создаю исполняемый JAR-файл, используя:

jar cvfm main.jar manifest.txt Main.class hello.jar

Содержимое main.jar теперь:

main.jar -+- Main.class
          |
          +- hello.jar
          |
          +- META-INF -+- MANIFEST.MF

Запуск исполняемого JAR с использованием:

java -jar main.jar

Я получаю ошибку загрузчика классов для Hello зависимости класса. Я понимаю, что это потому, что загрузчик классов ищет hello.jar по тому же пути, что и main.jar . Поэтому, когда я помещаю копию hello.jar рядом с main.jar , я могу запустить ее.

Что мне нужно сделать, чтобы иметь возможность запустить main.jar с hello.jar внутри него?

Я знаю, что вы спросите: «Почему он пытается сделать это таким образом?». Я знаю, что в основном для этого используются Eclipse, Ant, Maven или другие инструменты. Но, пожалуйста, просто позабавьте меня:)

Ответы [ 3 ]

6 голосов
/ 25 июля 2011

Ваш подход, к сожалению, совершенно неверен.Не существует «нормального» способа поместить банку внутри другой банки.Так что ваш hello.jar не имеет ничего общего с main.jar!Дело в том, что «нормальный» загрузчик классов не будет искать файлы jar внутри jar, следовательно, вы получите ошибку класса not found.Однако: если вы хотите отчаянно сделать это, то поищите в Google «OneJar» и перейдите на http://one -jar.sourceforge.net /

0 голосов
/ 25 июля 2011

Ну, я думаю, что вы можете столкнуться с ошибкой генерации банок.Проверьте эту ссылку , она может вас заинтересовать.

Тизер:

Насколько я знаю, и, основываясь на моих собственных попытках, нет никакого способауказать Class-Path, который заставляет загрузчик классов выглядеть во встроенных jar-файлах.Описание приведено в предыдущем абзаце.

Поэтому вы можете проверить одну из следующих ссылок: classpath-includes-jar-Within-a-jar , java-простейший способ слить-выпустить-в-один-jar-файл

Ура!

0 голосов
/ 25 июля 2011

Нет простого способа сделать это. То есть вам придется написать свой собственный загрузчик классов, если вы хотите вкладывать банки в банку.

Есть несколько продуктов, которые уже поддерживают это для вас. One-Jar - один из них, который я использовал с большим успехом - легко может написать его.

Вот интересная ТАК дискуссия на всю тему -

Самый простой способ объединить релиз в один файл JAR

...