Как доставить мое 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 или более поздней версии.

Посмотрите, если вы планируете распространять этот пакет (ваше приложение + JRE), есть утилита install4J, которая является мощным многоплатформенным сборщиком установщиков Java, который генерирует собственные установщики и средства запуска приложений для приложений Java.

Вы можете развернуть его с помощью веб-запуска 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

Другие вопросы по тегам