Eclipse: как создать исполняемый файл jar с внешним jar?

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

Когда я пытался экспортировать его в банку, я могу запустить программу, но не могу, когда пытаюсь нажать кнопку, которая включает вызовы функций и классы из внешней банки. Я отредактировал переменные среды (Windows XP) CLASSPATH, чтобы включить пути ко всем внешним банкам, но это не работает.

Следует отметить, что при экспорте исполняемого файла jar я получал предупреждения о компиляции, но при этом не отображается никакого описания предупреждений.

Кто-нибудь любезно предоставит подробное руководство о том, как включить внешнюю программу jar с помощью eclipse?


person Community    schedule 02.02.2009    source источник
comment
Не делай этого. Серьезно, никогда не полагайтесь на свою IDE при создании артефакта сборки, используйте для этой цели сценарии (maven, ant).   -  person Marko    schedule 02.02.2009
comment
В качестве альтернативы упоминаются Maven и Ant. Я мог бы перечислить более малоизвестные инструменты сборки, но эти два являются стандартными. Нет смысла вдаваться в подробности, так как о них уже есть много информации.   -  person Marko    schedule 04.08.2011


Ответы (6)


Eclipse 3.5 имеет возможность упаковать необходимые библиотеки в исполняемый jar. Файл -> Экспорт ... Выберите работающую банку и нажмите «Далее». В окне экспорта исполняемого файла jar есть переключатель, с помощью которого вы можете выбрать пакетирование необходимых библиотек в jar.

person Bob Tefft    schedule 29.04.2010
comment
Выглядит неплохо. За исключением того, что мне нужна конфигурация запуска. Но создать фиктивную конфигурацию запуска - не проблема. - person Hendy Irawan; 23.12.2010
comment
Это (может) также сгенерировать файл сборки Ant, который можно быстро запустить позже (внутри IDE или вне IDE). Лучший из двух миров! - person Hendy Irawan; 23.12.2010

Вы можете сделать это, написав манифест для своего jar. Взгляните на заголовок Class-Path. В Eclipse есть возможность выбрать собственный манифест при экспорте.

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

win32: java.exe -cp app.jar;dependency.jar foo.MyMainClass
*nix:  java -cp app.jar:dependency.jar foo.MyMainClass
person McDowell    schedule 02.02.2009
comment
Последнее предложение не сработает. Аргумент -cp-classpath) игнорируется при использовании -jar. - person BalusC; 21.03.2011
comment
@BalusC - вы правы; зависимость должна быть в манифесте. Отредактирую ответ. - person McDowell; 21.03.2011
comment
Я понятия не имел об этом. На уроках вообще не вникают в подобные вещи ... Хорошие подсказки! - person Ethan; 29.08.2012
comment
Первое предложение тоже не сработает. В документах говорится: The Class-Path header points to classes or JAR files on the local network, not JAR files within the JAR file or classes accessible over internet protocols. To load classes in JAR files within a JAR file into the class path, you must write custom code to load those classes. - person ashes999; 20.11.2013
comment
@ ashes999 В вопросе не требуется, чтобы JAR зависимости был связан с исполняемым JAR. В исходном плакате говорилось, что он пытался добавить JAR внешней файловой системы в путь к классам, и вы можете сделать это с помощью Class-Path. - person McDowell; 23.11.2013
comment
@ МакДауэлл, он сказал, что хочет build an executable jar program which depends on external jar downloaded. In my project, I included them in the build path. Это означает, что у него есть зависимости от классов. Это не сработает. Меня тоже удивило такое поведение. - person ashes999; 23.11.2013

Как включить jar-файлы проекта в исполняемый jar-файл:

Я использую версию Eclipse: 3.7.2, работающую на Ubuntu 12.10. Я также покажу вам, как сделать build.xml, чтобы вы могли выполнять ant jar из командной строки и создавать свою банку с другими импортированными банками, извлеченными в нее.

Обычно вы просите Eclipse создать файл build.xml, который импортирует ваши библиотеки в вашу банку за вас.

  1. Запустите Eclipse и создайте новый проект Java, создайте новый пакет mypackage, добавьте свой основной класс: Runner Поместите туда этот код.

    введите описание изображения здесь

  2. Теперь включите mysql-connector-java-5.1.28-bin.jar от Oracle, который позволяет нам писать Java для подключения к базе данных MySQL. . Сделайте это, щелкнув проект правой кнопкой мыши - ›свойства -› путь сборки java - ›Добавить внешний Jar -› выберите mysql-connector-java-5.1.28-bin.jar.

  3. Запустите программу в eclipse, она должна запуститься и сообщить вам, что имя пользователя / пароль недействительны, что означает, что Eclipse правильно настроен с jar.

  4. В Eclipse перейдите к File - ›Export -› Java - ›Runnable Jar File. Вы увидите этот диалог:

    введите описание изображения здесь

    Обязательно установите флажок «Сохранить как сценарий муравья». Именно поэтому вы можете использовать командную строку для выполнения ant jar позже.

  5. Затем зайдите в терминал и посмотрите скрипт ant:

    введите описание изображения здесь

Итак, вы видите, я запустил jar, и он не вызвал ошибки, потому что он обнаружил включенный mysql-connector-java-5.1.28-bin.jar, встроенный в Hello.jar.

Загляните внутрь Hello.jar: vi Hello.jar, и вы увидите много ссылок на com/mysql/jdbc/stuff.class

Чтобы сделать ant jar в командной строке, чтобы сделать все это автоматически: переименуйте buildant.xml в build.xml и измените имя цели с create_run_jar на jar.

Затем изнутри MyProject вы набираете ant jar и бум. У вас есть банка внутри MyProject. И вы можете вызвать его, используя java -jar Hello.jar, и все работает.

person Eric Leschinski    schedule 30.12.2013

В качестве хорошей практики вы можете использовать Ant Script (Eclipse поставляется с ним) для создания файла JAR. Внутри этого JAR могут быть все зависимые библиотеки.

Вы даже можете установить заголовок пути к классу МАНИФЕСТА так, чтобы он указывал на файлы в вашей файловой системе, хотя это не очень хорошая практика.

Пример сценария Ant build.xml:

<project name="jar with libs" default="compile and build" basedir=".">
<!-- this is used at compile time -->
<path id="example-classpath">
    <pathelement location="${root-dir}" />
    <fileset dir="D:/LIC/xalan-j_2_7_1" includes="*.jar" />
</path>

<target name="compile and build">
    <!-- deletes previously created jar -->
    <delete file="test.jar" />

    <!-- compile your code and drop .class into "bin" directory -->
    <javac srcdir="${basedir}" destdir="bin" debug="true" deprecation="on">
        <!-- this is telling the compiler where are the dependencies -->
        <classpath refid="example-classpath" />
    </javac>

    <!-- copy the JARs that you need to "bin" directory  -->
    <copy todir="bin">
        <fileset dir="D:/LIC/xalan-j_2_7_1" includes="*.jar" />
    </copy>

    <!-- creates your jar with the contents inside "bin" (now with your .class and .jar dependencies) -->
    <jar destfile="test.jar" basedir="bin" duplicate="preserve">
        <manifest>
            <!-- Who is building this jar? -->
            <attribute name="Built-By" value="${user.name}" />
            <!-- Information about the program itself -->
            <attribute name="Implementation-Vendor" value="ACME inc." />
            <attribute name="Implementation-Title" value="GreatProduct" />
            <attribute name="Implementation-Version" value="1.0.0beta2" />
            <!-- this tells which class should run when executing your jar -->
            <attribute name="Main-class" value="ApplyXPath" />
        </manifest>
    </jar>
</target>

person Lucas Pottersky    schedule 04.02.2009

Попробуйте расширение fat-jar. Он будет включать все внешние банки внутри банки.

person Marius    schedule 02.02.2009

посмотрите @ java-jar-ignores-classpath- Обходной путь

person Moro    schedule 17.02.2010