Перейти к содержимому

Как jar переделать в exe

  • автор:

Создание exe-файла из jar

Пользователям Windows привычнее использовать исполняемое приложение в виде exe-файла, нежели архивного jar-файла. Разработчики настольных java-приложений могут плагином launch4j не только обернуть исполняемый архивный jar-файл в оболочку exe-файла, но и включить в него иконку, автора, версию. Также данный плагин позволяет определить минимальную версию используемой JRE. В данной статье рассмотрим использование maven-плагина launch4j для получения exe-файла.

Описание java-примера

В качестве java-примера используем pluggable решение, включающее несколько jar-файлов. На следующем скриншоте представлена структура нашего экспериментального примера. Три файла, выделенные красным прямоугольником и относящиеся к задаче создания исполняемого exe-файла, рассматриваются ниже.

Несколько слов о структуре примера. Описание с исходными кодами данного java-примера представлено на странице Pluggable решение. Желающие могут поближе познакомиться с технологией динамической загрузки jar-файлов (классов), открыв страницу с подробным описанием исходников. На «выходе» данного примера получаем главный исполняемый модуль plugin-loader.jar, который использует common/plugin-api.jar для загрузки при необходимости (вызове) плагинов plugins/hello1.jar и plugins/hello2.jar.

Графический интерфейс примера, представленный на следующем скриншоте, включает 2 кнопки с надписями ‘Plugin1’ и ‘Plugin2’. При нажатии на одну из кнопок приложение подгружает необходимый плагин, который меняет надпись на кнопке.

Сообщения в консоли

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

Hello world. I am a plugin 1 I am a plugin 2

Изменения в исходных кодах

Необходимо отметить, что в модули PluginLoader.java и Boostrap.java были внесены изменения. Так в PluginLoader.java добавлена метка JLabel с отображением в интерфейсе версии Java :

. . . JLabel label = new JLabel("Java version : " + System.getProperty("java.version")); label.setSize(200, 24); frame.getContentPane().add(label); . . .

В класс Boostrap.java внесены изменения, связанные с чтением классов (*.class) из jar’ника, а не из директории bin, как это представлено в исходных кодах. Если этого не сделать, то придётся с собой ещё «таскать» и директорию bin с class’ами.

Листинг класса Boostrap.java

В главный класс Boostrap внесены изменения определения url : ниже исходной закомментированной строки размещается код определения url в jar-файле.

import java.io.File; import java.lang.reflect.Method; import java.net.URL; import java.net.URLClassLoader; public class Boostrap < public static void main(String[] args) throws Exception < File commonsDir = new File("commons"); File[] entries = commonsDir.listFiles(); URL[] urls = new URL[entries.length]; for (int i = 0; i < entries.length; i++) urls[i] = entries[i].toURI().toURL(); URLClassLoader loader; loader = new URLClassLoader(urls, null); // URL url = new File("bin").toURI().toURL(); File file = new File("."); String path = "jar:file:/" + file.getCanonicalPath(); URL url = new URL(path+"/plugin-loader.jar!/"); URLClassLoader appLoader; appLoader = new URLClassLoader(new URL[],loader); Class appClass = loader.loadClass("PluginLoader"); Object appInstance = appClass.newInstance(); Method m = appClass.getMethod("start"); m.invoke(appInstance); > >

Оборачивание исполняемого jar в exe-файл

Обычно плагин maven.plugins.launch4j включают в проектный pom.xml файл, в котором формируется и исполняемый jar-файл. Поскольку основная цель данной статьи наглядно продемонстрировать возможность оборачивания jar в exe, то уберем из проектного pom.xml все лишнее, что связано с формированием jar-файла. Правильнее сказать создадим такой pom.xml, который и будет решать основную задачу оборачивания jar в exe.

Cледующий листинг проектного файла pom.xml решает данную задачу. Сам pom.xml существенно упростился и стал более наглядным. В разделе определяются наименование компании (product.company) и наименование исполняемого файла (exeFileName), а также минимальная версия jdkVersion. Основные настройки плагина определяются в разделе . В секции указываются jar-файл, exe-файл (outfile) и иконка испольняемого файла (icon). Плагин будет ругаться, если не укажете наименование иконки. Следует отметить, что в секции необходимо указать главный стартуемый java-класс (mainClas).

 4.0.0 com.demo plugin-loader jar 1.0.0 plugin-loader 1.8 1.8 1.8 UTF-8 MultiModule PluginLoader PluginLoader  $   com.akathist.maven.plugins.launch4j launch4j-maven-plugin  plugin-loader package launch4j  gui $.exe $.jar $ favicon.ico Boostrap true anything   $  $ $ Swing application Copyright © 2011 $ $ $ $ $ $ $.exe         

На следующих скриншотах представлены вкладки свойств созданного PluginLoader.exe.

Скачать исходники

Вы можете скачать исходники рассмотренного примера (40.1 Кб), включающего как jar-файлы, так и exe-файл с проектными pom.xml.

Процесс автоматизации сборки данного примера рассмотрен на странице описания Многомодульного maven проекта.

Сборка приложения из JAR в EXE с JRE

Просто при запуске программы, написанной на Java, на машине, на которой она не установлена — программа, соответственно, работать не будет. Как решаются подобные вопросы?

Отслеживать
задан 12 апр 2015 в 9:03
danilatorsu danilatorsu
135 1 1 золотой знак 1 1 серебряный знак 10 10 бронзовых знаков

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

Самые популярное решение Launch4j или exe4j , но это всего лишь Загрузчик приложения на java, то есть jre все равно необходимо.

Отслеживать
ответ дан 12 апр 2015 в 15:53
1,865 1 1 золотой знак 17 17 серебряных знаков 25 25 бронзовых знаков

Можете приобрести Excelsior Jet. А можете собрать приложение с помощью gcj. Но размер вас не порадует. Можно собрать с JVM «в пузе», например с JamaicaVM.

Отслеживать
ответ дан 12 апр 2015 в 15:36
111 1 1 бронзовый знак
Кстати, сейчас можно купить Excelsior JET всего за $50: excelsiorjet.com/charity
13 апр 2015 в 12:30

Установите JRE. иначе никак. преобразование в .exe не спасёт. Ну если очень хочется преобразовать jar -> exe то вот ссылка, но jre — обязательный компонент

Отслеживать
ответ дан 12 апр 2015 в 9:27
3,405 2 2 золотых знака 21 21 серебряный знак 42 42 бронзовых знака
То есть приложения, написанные на java без jre вообще нельзя использовать?
26 июн 2019 в 19:26

    Важное на Мете
Связанные
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.3.2953

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Кофе-брейк #148. Как превратить любую Java-программу в автономный EXE-файл

Java-университет

Кофе-брейк #148. Как превратить любую Java-программу в автономный EXE-файл - 1

Источник: Mccue.dev Сегодня вы узнаете, как создать из Java-программы исполняемый EXE-файл для запуска в операционной системе Windows. Двойной щелчок для запуска — один из самых простых способов открыть программу. Если у человека, которому вы хотите показать свое приложение, уже установлена ​​правильная версия Java, для запуска он может дважды щелкнуть файл jar. Если же у него не установлена ​​Java, то есть способы создать исполняемый установщик, такой как jpackage. После этого для запуска кода нужно лишь нажать на этот установщик. Также можно использовать Native Image, чтобы превратить код в исполняемый файл, который не требует какой-либо дополнительной установки. В этой статье мы сосредоточимся на довольно простом подходе, который работает для любого приложения, независимо от того, какие зависимости вы включаете или какие функции JVM используете. Код, о котором сегодня пойдет речь, можно найти в репозитории GitHub, а исполняемые файлы с программой выложены здесь.

Используемый стек

Java 9+

java —version jlink —version

Maven

mvn —version

NodeJS

npx —version

Шаг 1. Скомпилируйте и упакуйте свой код в jar

Эта базовая программа создаст простое окно с текстом, который вы можете менять, нажимая на одну из кнопок в интерфейсе.

 package example; import org.apache.commons.text.WordUtils; import javax.swing.*; import java.awt.*; public class Main < public static void main(String[] args) < var label = new JLabel("Hello, World!"); label.setFont(new Font("Serif", Font.PLAIN, 72)); var uppercaseButton = new JButton("Uppercase"); uppercaseButton.addActionListener(e ->label.setText(WordUtils.capitalize(label.getText())) ); var lowercaseButton = new JButton("lowercase"); lowercaseButton.addActionListener(e -> label.setText(WordUtils.uncapitalize(label.getText())) ); var panel = new JPanel(); panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); panel.add(label); panel.add(uppercaseButton); panel.add(lowercaseButton); var frame = new JFrame("Basic Program"); frame.add(panel); frame.pack(); frame.setVisible(true); frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); > > 

Сейчас наша цель состоит в том, чтобы упаковать код вместе с его зависимостями в jar. JAR-файлы — это обычные ZIP-архивы с небольшой дополнительной структурой. Для проекта Maven конфигурация будет выглядеть следующим образом.

Здесь плагин “shade” будет обрабатывать включение кода из всех ваших зависимостей в jar. В данном случае единственной внешней зависимостью является org.apache.commons/commons-text.

mvn clean package
Затем мы переместим этот jar-файл в новый каталог target/, где он будет отделен от других файлов.
mkdir build mv target/javaexe-1.0.jar build

Шаг 2. Создайте среду выполнения Java (Java Runtime Environment, JRE)

Чтобы запустить уже созданный нами jar-файл, нужно связать его со средой выполнения Java. Для этого мы будем использовать jlink. Поскольку в экосистеме Java не используются модули, то вы, скорее всего, не слышали о них и не использовали jlink. Короче говоря, jlink может создавать “настраиваемые исполняемые образы”. Например, вы делаете веб-сервер. Вам не нужны AWT или Swing, поэтому включать их в код будет лишним. С помощью jlink вы можете создать JRE, которая вообще не включает модуль java.desktop. Эта система работает лучше всего, если ваше приложение и все его зависимости включают скомпилированные файлы module-info.java, которые дают jlink точную информацию, какие модули вы хотите включить. Вы также можете вручную определить список необходимых модулей, используя jdeps. И даже без модульного проекта мы можем эффективно клонировать нашу инсталляцию Java в каталог с помощью jlink.

jlink —add-modules ALL-MODULE-PATH —output build/runtime

Включение каждого модуля по отдельности дает уверенность в том, что такие библиотеки как org.apache.commons/commons-text будут работать именно так, как задумано. Нужно лишь выяснить, какие модули нам требуются.

Шаг 3. Объедините Jar и JRE в исполняемый файл

  1. Заархивируйте каталог, содержащий JRE и jar вашего приложения.
  2. Прикрепите сценарий-заглушку (stub script) к верхней части этого zip-файла, который извлечет данные во временный каталог и запустит код.

npx caxa \ —input build \ —output application \ —no-include-node \ — «<>/runtime/bin/java» «-jar» «<>/javaexe-1.0.jar»

Это создаст исполняемый файл с именем “application”. Если вы создаете его для Windows, то нужно указать “application.exe”. Когда исполняемый файл запускается, <> будет заменен на временный каталог, в котором был развернут zip-файл. Учтите, что при создании исполняемых файлов используются также и такие механизмы, как подпись кода и автоматические обновления. Однако эти вещи требуют более глубокого изучения, которое трудно вместить в одну публикацию.

Как конвертировать .jar в .exe на JDK 11?

Здравствуйте. Не могу понять, как скомпилировать exe`шник из .jar на JDK 11. С горем по-полам получилось сделать всё-таки рабочий .jar, который захотел запускаться только после того, как я в PATH прописал ещё и /bin/ jar`a с JAVAFX11, который подключался к проекту при разработке (javafx почему-то не поддерживается в JDK 11, пришлось сделать кучу костылей каких-то). Кстати, этот jar на др компах запускается только если поставить эту же JDK11 и так же прописать javafx отдельно. Самая новая версия обычной пользовательской jre se с сайта джавы почему-то говорит, что программа написана на более новой версии java (Это как вообще? Зачем делать JDK 11 и 12, если на сайте 8ая вообще, какая-то?). В итоге сейчас не могу сделать из этого всего exe, потому что все бесплатные и условно бесплатные проги (Lounch4j, JSmooth, Jet) тупо не хотят работать с такими версиями java. Просит 1.6 — 1.8.9. Опять же, как это понимать, вообще?

Вообщем, вопрос скорее о том, что я не понимаю всей этой мишуры с версиями и сборками. Зачем вообще что-то писать на старых версиях и так хардово их поддерживать? Как пользоваться javafx так, что бы мне не приходилось постоянно что-то костылить при сборках? Почему проект, сделанный на JDK 11 запускается только с него же? Пользовательского jre на сайте этой версии что-то я не нашёл. Какой вообще смысл в десктоп разработке, если у тебя на выходе даже exe`шник сделать не получается без кучи каких-то костылей со стороны? Моему готовому проекту уже ни как не попасть в продакшн? — Зачем его вообще писать тогда, если он запускается только из твоей IDE? Вообщем, ни чего не понимаю, люди добрые, спасите.

  • Вопрос задан более трёх лет назад
  • 1157 просмотров

2 комментария

Простой 2 комментария

Сергей Горностаев @sergey-gornostaev Куратор тега Java
Стоило сначала изучить платформу, а потом писать для неё приложение.

sergueik

kkolorid зафиксируйте что ваш проект требует 8 и снесите 11 — javafx гораздо стабильнее на восьмой
Решения вопроса 1

jamakasi666

Дмитрий Александров @jamakasi666 Куратор тега Java
Просто IT’шник.

Ну начнем по порядку.
Java как язык и среда крайне консервативная и любые нововведения как правило воспринимаются в штыки. Плохо это или хорошо вопрос крайне тонкий и в глазах потребителя всегда разный. Со стороны энтерпрайза это просто восхитительно, есть огромный выбор в хороших специалистах, есть огромное время поддержки нужной версии которая обкатана годами и уже почти все известно о всех тонкостях. Со стороны мелких инноваторов и разработчиков развитие идет непостижимо медленно а значит есть отставание от трендов и оно значительное.
Предрекая вопрос что за бред привожу следующий факт по поддержке версий:
J2SE 1.4 выход 2002 год, конец поддержки 2013
J2SE 5.0 выход 2005 год, конец поддержки 2015
J2SE 6 выход 2006 год, конец поддержки 2018
J2SE 7 выход 2011 год, конец поддержки 2022
J2SE 8 выход 2014 год, конец поддержки 2025
J2SE 9-10 вышли в 2017/18 годах, проходные бэты и ключевой момент развития и политики java в котором произошло множество огромных изменений политики. Особенно изменилась лицензия по моему именно где то тут и очень сильно, рекомендую почитать холивары на эту тему.
J2SE 11 вышла в 2018, конец поддержки 2026 год.
Если вдаваться в абстракцию могу предложить следующую иллюстрацию. (еще раз это просто иллюстрация для понимания и попыток провести параллель с чем то иным).
Предположим что майкрософт идет тем же трендом что и оракл как и весь мир большого бизнеса. На выходе имеем следующее:
-основная ОС на которую ориентируются большие игроки рынка софта и игр является winXP.
-миром до сих пор правят однопоточные но многогерцовые процессоры которые правда уперлись в 5Ггц. Зачем менять то что и так прекрасно в простоте. Просто удешевляем и «ухолодняем» производство. Да и вообще у основной массы все еще камни уровня 1 поток и 3.4 ГГц. Ориентируемся на это.
-миром видеокарт до сих пор правят dx9c без новомодных нововведений, без cuda\opencl, без dxr, без подходом низкоуровнего апи вида вулкана\dx12. Зачем менять то что итак прекрасно работает и давно известно с каждой стороны. Видеокарты выходят давно упер в возможности выходя из ревизии к ревизии с фиксами багов и удешевлением производства. Да и в общем то зачем что то новое, т.к. у основной массы еще графика уровня встройки.
— всякие nvme\m2\pcie4 все от лукавого, зачем это если у массового пользователя все еще sata2 hdd который едва ли выдает что то среднее.
-мониторы у всех в среднем 800х600 пикслей, а зачем больше то?
+ На выходе с этими ориентировками имеем универсальный продукт(софт\игру) которая будет работать вообще у всех в среднем отлично, все возможные баги были известны и пофикшены еще 10 лет назад. Новомодное все от лукавого и только у единиц энтузиастов, а значит не берем их в расчет или берем пытаясь выдать это как фичу.

Теперь немного пояснений к вышесказанному, разработчики, большие естественно, получают колоссальное преимущество т.к. их много, есть выбор, они знают и понимают что и как происходит, у них есть богатый стаж как делать можно и как нельзя, а главное почему. Изучение языка и стандарта версии крайне подробное, тонны книг, курсов, обсуждений. С другой стороны никаких новшеств нет, все как на уровне 10 лет назад так и осталось, хочешь круглую кнопочку так забудь или только медленными костылями за которые сразу объявят костылеписателем рукожопом.

Надеюсь параллель понятна. Теперь к вопросу.
Сейчас, я напомню 2019 год, скажу честно видел не один десяток энтерпрайз решений которые до сих пор все еще развиваются на jre7. Есть те кто скрипя зубами переходит на jre8, но пока, опять же лично мои наблюдения, это вот прям скрипя зубами о асфальт, очень нехотя, очень не хочется.

Касательно компиляции в ехе, нет такого понятия в мире java. Опять же дам пояснения.
Java это про изоляцию хостового железа от софта. Т.е. у Вас есть софт которому глубоко фиолетово сколько там ядер, какая ФС, какая ОС и т.д. .JRE это «виртуальная машина» и в этом ее прелесть, «есть один бинарник который работает везде и которому пофиг где он был запущен» главное чтобы была JRE.
И вот тут возникает прикол, самих реализаций JRE множество, есть платные, есть бесплатные, есть условно платные, у каждой своя лицензия и ограничения Каждая решает свои проблемы.

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

Ну ладно хватит вокруг да около, а то развел демагогию. Лично мое мнение и практика, JAVA приложения вообще нельзя, еще раз НЕЛЬЗЯ собирать в ехе или любую другую самодостаточную сборку.
Банально но потому что Вы врезаете пользователя или СЕБЯ в лицензию или ограничения. Ну например вы собрали ехе который по сути включает jre под win10 и скинули мне, а у меня winXP и нифига не работает, а если работает то с совершенно непонятными логами багов. Вот скинули бы jar файл с пометкой что собран под jre7 то проблем бы не было от слова совсем.

А, и к слову, даже встроенный механизм java по сборке так называемых native сборок не решает проблем разношерстности от слова совсем.

PS. надеюсь не зря написал такое эссе и донес свою мысль. Мысль основывается на моих наблюдениях и опыте.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *