Сборка JAR, включающая все его зависимости

Вероятно, это действительно фундаментальный вопрос, но, боюсь, я мало что знаю о 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 ответов

Решение

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

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

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

Используйте File -> Export -> Java -> Runnable JAR файл вместо Eclipse.

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

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

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

На всякий случай, если вы делаете с 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 с зависимостями?

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

Другие вопросы по тегам