Как доставить мое Java-приложение с определенной JRE?
Кто-нибудь знает, как упаковать конкретную JRE вместе с откомпилированным Java-приложением? В настоящее время у меня есть исполняемый файл JAR и я хочу добавить в него обновление 31 для JRE. Таким образом, приложение использует JRE независимо от того, какую версию JRE установил клиент. Решение должно работать независимо от платформы.
Есть идеи? Спасибо заранее!
10 ответов
В OSX они уходят от Apple, предоставляющей Java, к Oracle, предоставляющему Java, это также означает, что Java не будет установлена при новой установке OSX. Oracle предоставил инструмент для упаковки установок Java, и они настоятельно рекомендуют предоставить jre как часть вашей установки. Преимущество этого заключается в том, что заказчику не нужно устанавливать дополнительный пакет для запуска приложения, и вы можете протестировать свое приложение на соответствие правильной среде выполнения Java и убедиться, что перед отправкой нет никаких несовместимостей. Недостатком является то, что сборка установщика немного сложнее, а размер загружаемого файла больше.
Конечно, сборочные инсталляторы становятся более сложными, если вы хотите предоставить свои приложения для Windows, Linux ectera, и было бы намного проще просто предоставить исполняемый файл jar, но это не тот опыт, который хотят клиенты. Клиенты не ожидают, что смогут загрузить одно приложение и запустить один и тот же исполняемый файл на Windows, OSX и Linux. Они счастливы
иметь разные установщики для каждой платформы, а также ожидать, что установщики будут работать по-разному.
Вот как я это делаю:
OSX: используйте AppBundler с jre в комплекте, поместите в Dmg с DMGCanvas. Пользователь просто перетаскивает приложение в свою папку /Application.
Windows: используйте Izpack со встроенным jre, обернутым с launch4j, чтобы установщик мог быть запущен как exe.
Linux: используйте Izpack без встроенного jre, поскольку пользователи linux предпочитают контролировать то, что находится на их компьютере, но указывают минимально допустимую версию Java. В идеале я должен создать пакеты для основных менеджеров пакетов Linux, таких как rpm, но я решил, что в данный момент это не стоит усилий, так как пользователи Linux составляют небольшой процент от моей клиентской базы.
Большая часть установки автоматизирована с использованием Maven и Ant, поэтому создание различных установщиков не составляет большого труда.
Если у вас установлена jre на целевой платформе, скажем, Windows 64 bit, просто скопируйте все под jre
папку в вашей установке Java и поместите его в свой дистрибутив. Затем создайте командный файл, чтобы он указывал на ваш локальный jre вместо системного.
Вот что я делаю:
- мой файл находится в
dist
папка - скопировать систему
jre
папка дляdist\jre-win-1.7.0_04
- создайте файл.bat со следующей строкой
jre-win-1.7.0_04\bin\java.exe -jar MyProgram.jar
... бум, готово! Дважды щелкните командный файл, и он запустит ваш jar-файл с локальным jre. Чтобы доказать это, удалите системную версию jre и дважды щелкните командный файл. Еще работает.
Вы можете сделать это в Linux или OS X аналогичным образом.
Я также хотел бы отметить, что это довольно распространенная практика, и многие дистрибутивы Java выполняются следующим образом. Так что не говорите, что не можете или не должны.
Однако есть несколько предостережений. Это делает ваш дистрибутив больше и зависит от платформы, в моем примере Windows x64. Тем не менее, это выполнимо и управляемо. Для jre поддерживается конечное число платформ, и угадайте, что... они тоже зависят от платформы.
У нас такая же ситуация с коммерческим продуктом в производстве. Мы скачали как JRE для Windows, так и Linux определенной версии, и упаковали их в приложение, используя IzPack.
"Наш" JRE должен быть установлен, если кто-то хочет установить приложение, и приложение запускается этим JRE независимо от установленных в системе JRE или JDK.
Недостатком является: установщик должен быть сделан для Windows или Linux, и его размер составляет ~ 50 МБ. Размеры модулей в распакованном виде:
- само приложение ~ 5 МБ
- libs ~10 МБ
- JRE ~90 МБ
Если бы я хотел сделать его более "независимым от платформы", мне пришлось бы упаковать обе JRE, которые для установщика составляли бы ~100 МБ. И это все равно будет справедливо только для двух типов платформ (см. Ответ Ктулху).
Обратите внимание, что мы в основном выполняем удаленную установку через SSH и что использование параметров сжатия увеличивает время пакета как минимум в ~ 10 раз (с минут до десятков минут).
Довольно новое решение, предоставленное Oracle, здесь:
Это читает:
Автономные пакеты приложений предоставляют следующие преимущества:
Пользователи устанавливают приложение с помощью знакомого им установщика и запускают его обычным способом.
Вы контролируете версию JRE, используемую приложением.
Приложения могут быть развернуты на новых системах без необходимости установки JRE.
Но недостатком этого подхода является:
Автономные пакеты приложений могут быть собраны только с использованием JDK 7 Update 6 или более поздней версии.
Вы можете развернуть его с помощью веб-запуска java, который позволяет вам загрузить определенную версию jre, если она отсутствует. Однако я не знаю, возможно ли понижение рейтинга. Ява должна быть уже установлена.
Вам нужны специфичные для платформы средства запуска, которые используют JRE, который находится рядом с файлом JAR. Конечно, вы можете сделать это с помощью пакетных файлов и сценариев оболочки, но есть более профессиональные решения, которые создают собственные средства запуска, такие как install4j. (Отказ от ответственности: моя компания разрабатывает install4j). Бесплатное решение - izpack.
Если это приложение на платформе NetBeans, то у NetBeans есть возможность объединить дополнительные ресурсы и JRE .
Источник: https://platform.netbeans.org/tutorials/nbm-nbi.html
Это не возможно напрямую. Чтобы сделать это возможным, вы должны загрузить виртуальные машины для каждой платформы. Для окон скопируйте JRE в каталог и jar и вызовите распределенную JVM с помощью сценариев оболочки. Но это так сложно, и решение, описанное Ктулху, является лучшим, т.е. проверьте версию и укажите веб-страницу.
Однако есть некоторые, которые вы можете проверить.
JSmooth - http://jsmooth.sourceforge.net/
Jar2Exe - http://transfer2pc.weebly.com/1/post/2011/10/jar2exe-converter-11-gui.html
Вы можете взглянуть на jrecreate, предоставленный oracle, и он может просто делать то, что вам нужно / нужно.
https://docs.oracle.com/javase/8/embedded/develop-apps-platforms/jrecreate.htm