Launch4J - как подключить зависимые банки к сгенерированным exe

У меня есть простой Java-проект, который требует внешних банок. Я создаю это с помощью netbeans, а после команды Clean и Build я могу найти в каталоге dist следующую структуру:

-myApp.jar
-lib/
     library1.jar
     library2.jar

типичный, я бы сказал.

Теперь я хотел бы распространять myApp.jar с зависимыми библиотеками как один exe. Это возможно? Я пытаюсь использовать Launch4J. В графическом интерфейсе я создаю файл конфигурации, есть некоторые опции в разделе cp

<cp>lib/swing-layout-1.0.4.jar</cp>

но это похоже на classpath, и это единственное место, где я могу ссылаться на мои дополнительные банки.

После создания exe файла я не могу найти зависимости libs в exe (exe можно открыть с помощью winrar), и, таким образом, мое приложение аварийно завершает работу.

Как я могу сделать exe файл правильно?

Спасибо за вашу помощь.

Ответ 1

Как это часто бывает, когда вы не можете решить проблему, я опубликовал ее на StackOverflow... и довольно скоро после публикации вопроса у меня появилась идея.

Итак, ответ на мой вопрос:

Поместите все зависимые банки в одну основную банку.

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

Чтобы помочь людям, я решил опубликовать здесь подробные инструкции - они основаны на Netbeans 7.4.

  • Следуя статье http://mavistechchannel.wordpress.com/2010/08/17/how-to-build-a-single-jar-file-with-external-libs/, я создал ant script, которые строят одно-jar-приложение для меня. Я мог бы вручную создать exe через Launch4J

  • Затем я решил, что мне нужна более автоматическая задача, и я сделал это, ant строит exe для меня (через Launch4J)

  • Затем я понял, что должен выполнить "чистку и сборку" перед моей автоматической задачей (в пункте 2)/Я решил, что хочу, чтобы чистые и строгие выполнялись автоматически до сборки exe

Собирая все вместе, я прикрепляю свою конструкцию ant build script, состоящую из точек 1,2,3:

Требуется отредактировать файл build.xml и поместить содержимое, указанное ниже, перед тегом конца проекта

<target name="package-for-launch4j" depends="clean,compile,jar">
    <property name="launch4jexe.dir" location="C:\Program Files (x86)\Launch4j" />
    <taskdef name="launch4j"
             classname="net.sf.launch4j.ant.Launch4jTask"
             classpath="${launch4jexe.dir}/launch4j.jar
            :${launch4jexe.dir}/lib/xstream.jar" />
    <property name="launch4j.jar.name" value="MyAppJarName"/>
    <property name="launch4j.dir" value="exe"/>
    <property name="launch4j.jar" value="${launch4j.dir}/${launch4j.jar.name}.jar"/>
    <echo message="Packaging ${application.title} into a single JAR at ${launch4j.jar}"/>
    <delete dir="${launch4j.dir}"/>
    <mkdir dir="${launch4j.dir}"/>
    <jar destfile="${launch4j.dir}/temp_final.jar" filesetmanifest="skip">
        <zipgroupfileset dir="dist" includes="*.jar"/>
        <zipgroupfileset dir="dist/lib" includes="*.jar"/>
        <manifest>
        <attribute name="Main-Class" value="${main.class}"/>
        </manifest>
    </jar>
    <zip destfile="${launch4j.jar}">
        <zipfileset src="${launch4j.dir}/temp_final.jar"
            excludes="META-INF/*.SF, META-INF/*.DSA, META-INF/*.RSA"/>
    </zip>
    <delete file="${launch4j.dir}/temp_final.jar"/>
    <launch4j configFile="misc/l4j-myapp.xml" />
</target>

затем в Netbeans rightclick на файле build.xml и выберите: Запуск цели/Другие цели/пакет для запуска4j

exe файл готов в папке exe: -)

Ответ 2

Я потратил часы на эту проблему. Итак, вот мой вклад.

Проблема здесь: как успешно поставить ваши внешние банки, что ваша программа .JAR нуждается в том, что вы создаете .exe.

Предположим, что вы уже и правильно настроили внешние банки на eclipse/netbeans и ALL WORK FINE командой: java -jar yourprogram.jar.

Таким образом, реальная проблема заключается в том, как обеспечить, чтобы этот .EXE файл содержал внешние банки, иначе он не будет работать должным образом.

1) Прежде всего, вам нужно забыть Launch4J и любую другую программу.

2) Установите JSmooth, я рекомендую вам использовать версию Windows.

3) В левом меню есть кнопка "Приложение". Нажмите на нее.

4) Появится вкладка "Classpath". Нажмите на плюс (+) и добавьте внешние файлы .jar. И это все!

Не забудьте поставить метку приложения .jar в поле "Использовать встроенную банку" и правильно выбрать основной класс. Он будет работать.

Ответ 3

Включение разных ссылок, которые помогли мне

Как включить все зависимые Jars в один неисполняемый банку?

Как создать исполняемый JAR с зависимостями с помощью Maven?

http://www.mkyong.com/java/how-to-make-an-executable-jar-file/

и, самое главное,

http://docs.oracle.com/javase/tutorial/deployment/jar/manifestindex.html

быстрый тут

http://www.mkyong.com/java/how-to-add-your-manifest-into-a-jar-file/

Ответ 4

Я также столкнулся с той же проблемой при переносе моего.jar в exe. У меня также было много зависимых библиотек. Итак, это были шаги, которые я выполнил:

  1. Загрузите и установите launch4j.

  2. Откройте проект в netbeans. Очистите и создайте проект.

  3. Убедитесь, что в каталоге проекта есть папка с именем "dist". Он будет иметь ваши файлы jar с папкой lib (содержащей зависимые библиотеки).
  4. Открытый запуск 4j.
  5. Создайте выходной файл в папке dist. Например: OutputFile: D: ******\My_App\dist\my_application.exe
  6. Просмотрите файл jar в следующей строке. Например: Jar: D: ******\My_App\dist\my_application.jar
  7. Перейдите на вкладку классов. Отметьте CustomClasspath. Нажмите значок просмотра и перейдите к файлу jar, который находится в папке dist.
  8. Укажите версию Min Jre на вкладке JRE.
  9. Сохраните конфигурацию.
  10. Создайте оболочку (щелкнув значок настроек)
  11. Ваш exe файл будет создан в папке dist. Это оно :)

Ответ 5

Чтобы включить внешние библиотеки с Launch4j, вы должны иметь файлы ".jar" внешних библиотек рядом с вашим.exe (мои только в одной папке), а затем в "Classpath" вы помещаете путь к файлам.jar в " Изменить элемент:

Ответ 6

В launch4j перейдите на вкладку classpath. Отметьте поле пользовательского пути к классам. В поле редактирования введите полный путь к каждой банке, которую хотите включить, и нажмите "Принять". Когда закончите, просто введите имя основного класса в отдельное поле (например, MyProg). Все банки теперь будут включены в exe.

PS У меня все банки в одном каталоге. Я использую версию 3.12

Ответ 7

Когда вы конвертируете свой файл .jar

  1. Перейти на вкладку classpath
  2. Проверьте пользовательский путь к классу
  3. В основном классе выберите свой .jar из папки dist после сборки проекта.
  4. В текстовой области classpath добавьте свои библиотеки, вы добавляете их прямо под этой текстовой областью, записывая полный путь к библиотеке (конечно, включая библиотеку, то есть "C:\folder\lib\file.jar")

Example