Как jar переделать в exe
Перейти к содержимому

Как 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

Данный формат является Java-архивом и представляет собой обычный ZIP-файл, в котором часть программы написана на языке Java. Постепенно вытесняются новыми мобильными платформами, т.к. JAR используется для запуска приложений и игр на мобильных телефонах предыдущего поколения. Могут содержать цифровую подпись, активно используются в популярных браузерах для хранения дополнений и тем.

Поддерживаемые Преобразования

Конвертировать из JAR Конвертации Рейтинг
1 JAR в ZIP 4.5 4,344 голосов
2 JAR в RAR 4.5 348 голосов
3 JAR в 7Z 4.5 35 голосов
4 JAR в TGZ 4.9 13 голосов
5 JAR в ARJ 4.3 12 голосов
6 JAR в TAR.BZ 4.4 7 голосов
7 JAR в CPIO 4.7 7 голосов
8 JAR в TAR 5.0 4 голосов
9 JAR в TAR.XZ 4.3 4 голосов
10 JAR в TAR.LZMA 4.0 4 голосов
11 JAR в TAR.7Z 4.0 2 голосов
12 JAR в TAR.Z 5.0 2 голосов
13 JAR в TBZ2 4.5 2 голосов
14 JAR в LHA 5.0 2 голосов
15 JAR в TAR.LZO 5.0 1 голосов
Конвертировать в JAR Конвертации Рейтинг
1 ZIP в JAR 4.6 7,825 голосов
2 RAR в JAR 4.6 1,595 голосов
3 7Z в JAR 4.5 188 голосов
4 TGZ в JAR 4.7 41 голосов
5 DEB в JAR 3.8 40 голосов
6 TAR в JAR 4.4 40 голосов
7 RPM в JAR 5.0 17 голосов
8 CAB в JAR 4.8 6 голосов
9 ARJ в JAR 5.0 3 голосов
10 TBZ2 в JAR 5.0 3 голосов
11 ACE в JAR
12 ALZ в JAR
13 ARC в JAR
14 CPIO в JAR
15 LHA в JAR

Как конвертировать из .exe в .jar? Очень надо!

это невозможно. нужно декомпилировать ехе, переписать на Яву и собрать в jar-это может только Онотоле. Онотоле занят спасением Вселенной от планеты Нибиру.

Остальные ответы

Что сказал? ? Нельзя такое делать. . exe — должно запускаться с Windows, а jar — это java-приложение для телефонов. .
Сделай мне из картинки (JPG) музыку (MP3)..никак.

4000 EUR
Предоплата.

.exe — это программа для Виндовз.. .

а .jar — это программа для мобильника, написанная на языке Java

Обычно никак
exe — исполняемый бинарник для винды или доса
jar — переименованный архив zip с java-кодами библиотек java-машины
(мобилы часто используют Java, но они только используют — область применения Джавы гораздо шире) ) )

Можно попробовать запустить exe. Если самораспаковывающийся архив, то может сработать
Или попытаться натравить winrar на этот экзешник
Но если внутри exe не архив, а уже скомпилированное, то не спасёт

Как конвертировать .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 не будет опубликован. Обязательные поля помечены *