Сборка JAR, включающая все его зависимости - PullRequest
9 голосов
/ 15 марта 2012

Вероятно, это действительно фундаментальный вопрос, но, боюсь, я мало что знаю о Java и нигде не могу найти ответ.

Я пытаюсь создать библиотеку Ant, которая зависит от TFS SDK. Я следовал руководству по настройке проекта, но когда я экспортирую его как JAR и пытаюсь запустить задачу с помощью ANT, я получаю следующую ошибку:

java.lang.NoClassDefFoundError: /com/microsoft/tfs/core/util/TFSUser

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

В этом ответе , кажется, говорится, что можно включить все ресурсы, необходимые для запуска с использованием Eclipse (я использую 3.7.2), но в нем не описано, как на самом деле это сделать. Какой вариант в Eclipse сделать это?

Ответы [ 5 ]

3 голосов
/ 15 марта 2012

Вместо Eclipse используйте Файл -> Экспорт -> Java -> Запускаемый файл JAR.

"Извлечение необходимых библиотек в сгенерированный JAR" должно быть тем, что вам нужно.

3 голосов
/ 15 марта 2012

Выберите «Извлечь необходимые библиотеки в сгенерированный JAR» при экспорте.

Extract required libraries into generated JAR

Выберите «Извлечь необходимые библиотеки в сгенерированный JAR» при экспорте.

1 голос
/ 15 марта 2012

Когда вы создаете JAR, вы получаете JAR, содержащий только ваш код, а не какие-либо зависимости, которые требуются вашему Jar. Вы можете использовать что-то вроде jarjar , чтобы объединить все зависимости в один простой для управления Jar-файл или скопировать все зависимые JAR-файлы в папку для удобства использования. Похоже, что в Eclipse есть опции, позволяющие делать подобные вещи (см. Сообщения выше).

Другим вариантом будет использование системы управления зависимостями, такой как Maven или Ivy . Это имеет более высокую кривую обучения, но для библиотеки это целесообразно, так как она позволит пользователям вашей библиотеки легко получить все зависимости. Для приложения конечного пользователя, вероятно, лучше использовать один распространяемый дистрибутив (для которого вы можете использовать Maven или Ivy для внутреннего управления зависимостями, а затем что-то вроде jarjar или Java Web Start для распространения среди ваших конечных пользователей) .

0 голосов
/ 20 апреля 2016

На всякий случай, если вы делаете с Maven. Вам необходимо включить следующий плагин.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.4</version>
    <configuration>
        <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <properties>
            <property>
                <name>listener</name>
                <value>com.example.TestProgressListener</value>
            </property>
        </properties>
    </configuration>
    <executions>
        <execution>
            <id>make-assembly</id> <!-- this is used for inheritance merges -->
            <phase>package</phase> <!-- bind to the packaging phase -->
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Подробнее @ как создать файл JAR с зависимостями?

0 голосов
/ 15 марта 2012

Вы должны зависеть от атрибута classpath в файле манифеста.Это хорошо объяснено на Как упаковать библиотеки в мою флягу, используя Ant

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...