Как лучше всего распространять приложения Java? [закрыто]


115

Java - один из моих любимых языков программирования. Я всегда сталкиваюсь с проблемой распространения моего приложения среди конечных пользователей.

Предоставление пользователю JAR не всегда так удобно, как хотелось бы, и использование Java WebStart требует, чтобы я поддерживал веб-сервер.

Как лучше всего распространять приложение Java? Что, если приложению Java необходимо установить артефакты на компьютер пользователя? Существуют ли какие-нибудь хорошие системы установки / упаковки Java?


Java WebStart можно использовать с любого URL-адреса, например файловой системы, например компакт-диска или сетевого диска. Конечно, это не так много. Примечание: eclipse не использует установщик, вы просто распаковываете его и запускаете. Возможно, вам не нужен установщик.
Питер Лоури,

1
В наши дни очень просто развернуть такое приложение Java WebStart, например, в Google Application Engine.
Thorbjørn Ravn Andersen

6
Обидно, что этот вопрос закрыт. Я не согласен с причиной, заявленной «как основанная прежде всего на мнении». Предоставленные ответы основаны не на мнении, а на опыте. Я всегда приветствую хорошие ответы, основанные на опыте. Те, кто не может извлечь уроки из истории, обречены повторять ее.
bouvierr

Вы можете использовать jlink (представленный в JDK 9) для распространения приложений Java. Он поставляется с JDK. Он создаст для вас специальную JRE. Вам не нужно устанавливать Java на клиентские машины.
blueray

Ответы:


89

В зависимости от требований вашего дистрибутива существует множество решений.

  1. Просто используйте банку. Это предполагает, что у пользователя установлена ​​правильная версия java, в противном случае пользователь получит исключения «версия формата файла класса». Это нормально для внутреннего распространения внутри компании.

  2. Используйте launch4j и такую ​​программу установки, как NSIS. Это дает вам гораздо больше контроля, хотя пользователь все еще может делать глупые вещи, например, деинсталлировать среду выполнения java. Это, наверное, самый популярный подход, который я использую сейчас.

  3. Используйте Webstart. Это также предполагает, что у пользователя установлена ​​правильная версия java, но это намного легче начать. Мой опыт показывает, что это нормально для жестко контролируемых сред интрасети, но становится проблемой при более крупных развертываниях, поскольку в нем есть много странных сбоев. Он может стать лучше с новой технологией подключаемых модулей в Java 1.7.

  4. Используйте компилятор с собственным кодом, например Excelsior JET, и распространяйте его как исполняемый файл или заключите его в установщик. Дорого, и это обычно связывает вас с немного более старой версией java, и есть некоторая проблема с динамической загрузкой классов, но она очень эффективна для крупномасштабного развертывания, когда вам нужно свести к минимуму проблемы с поддержкой.


4
Просто примечание о веб-запуске: до тех пор, пока у пользователя установлена ​​версия Java, которая не из каменного века (например, 1.2), веб-запуску можно приказать загрузить и установить более новую версию Java, которая вам нужна для вашей программы, отсутствует все же. Посмотрите на синтаксис файла .jnlp. Конечно, это по-прежнему довольно заметно показывает, что вы используете Java, что может быть неуместным в зависимости от клиентов, с которыми вы имеете дело. В таких случаях вам действительно следует использовать какой-то «родной» формат установщика / файла и по возможности скрыть детали реализации.
Дэниел Шнеллер,

10
Мне не нравится Webstart. В нем слишком много брендов Java / Sun. Трудно заставить его работать правильно. Настройка подписи кода - это больше проблем, чем она того стоит, и пользователь все равно не понимает преимуществ безопасности и сообщений. Если вы хотите что-то сделать в системе пользователя, вам придется заплатить за сертификат подписи кода, чтобы избавиться от страшных предупреждений. Он выполняет много сложного кэширования, которое может вызвать проблемы. Возможно, OSGi или будущие модули Java предложат аналогичные преимущества автоматического обновления. Я использую вариант №2 и создаю DMG / Packager для Mac полностью из Ant.
Cal

Я использовал NSIS, как вы предложили. Еще смотрел launch4j. Почему вы рекомендуете использовать оба?
jacknad

1
@JackN NSIS - это генератор установщика. Launch4j специально предназначен для облегчения запуска / запуска программ Java. Их функции частично совпадают, но они нацелены на разные части проблемы.
Ноэль Грандин

+1 отличный ответ. Есть ли у вас опыт работы с Excelsior JET? Поддерживает ли он только архитектуру x86 и не может загрузить библиотеку jar в реальном времени?
KJW

6

Расширенный установщик упрощает упаковку Java-приложений как исполняемых файлов Windows, и он довольно гибок в том, как вы можете его настроить. Я обнаружил, что для распространения Java-приложений среди клиентов Windows это самый простой способ.


5

JSmooth - это простая программа, которая помещает вашу банку в стандартный исполняемый файл Windows. Он поставляется с простым графическим интерфейсом, который позволяет вам настроить необходимую JVM, связать ее с приложением или предоставить возможность загрузки, если она еще не установлена. Вы можете отправить exe-файл как есть или заархивировать его с возможными зависимостями (или позволить программе загружать дополнительные зависимости из сети при запуске). Это также бесплатно, как в пиве и речи, что может быть (а может и нет) хорошо.


4

Это зависит от того, насколько искушены ваши целевые пользователи. В большинстве случаев вы хотите изолировать их от того факта, что вы используете приложение на основе Java. Предоставьте им собственный установщик, который делает правильные вещи (создает записи в меню «Пуск», средства запуска, регистрируется в программах добавления / удаления и т. Д.) И уже связывает среду выполнения Java (так что пользователю не нужно знать или заботиться о ней). Я хотел бы предложить наш инструмент для кросс-платформенной установки BitRock InstallBuilder., Хотя он не основан на Java, он обычно используется для упаковки приложений Java. Его можно легко интегрировать с Ant, и вы можете создавать установщики Windows из Unix / Linux / Mac и наоборот. Поскольку созданные установщики являются собственными, они не требуют наличия шага самоизвлечения или наличия JRE в целевой системе, что означает меньшие размеры установщиков и избавляет вас от некоторых головных болей. Также хочу отметить, что у нас есть бесплатные лицензии на проекты с открытым кодом.


3

исполняемые файлы лучше всего, но они ограничены платформой, т.е. используйте gcj: http://gcc.gnu.org/java/ для Linux для создания исполняемых файлов и используйте launch4j: http://launch4j.sourceforge.net/ для создания исполняемых файлов Windows. Для упаковки в Linux вы можете использовать любой упаковщик rpm или deb. Для win32 попробуйте http://en.wikipedia.org/wiki/Nullsoft_Scriptable_Install_System


3

Если это реальное приложение для конечного пользователя с графическим интерфейсом пользователя, вам следует игнорировать язык, на котором вы написали программу (Java), и использовать собственный установщик для каждой из выбранных вами платформ. Пользователи Mac хотят иметь .dmg, а для Windows - установщик .msi или .exe. В Windows я предпочитаю NSIS от NullSoft только потому, что это менее нежелательно, чем InstallShield или InstallAnywhere. В OSX вы можете рассчитывать на то, что JVM уже существует. В Windows вам нужно будет проверить и установить его при необходимости. Люди, работающие с Linux, не будут запускать приложения с графическим интерфейсом пользователя Java, и те немногие, которые будут, знают, что делать с исполняемым файлом .jar.


3
действительно? люди linux не запускают приложения с графическим интерфейсом? то я думаю , что его программа бесполезно их рендеринг всей дискуссии спорное.
Мэтт

@Matt, почему вы предполагаете, что исходное приложение было приложением с графическим интерфейсом? Я установил много Java-приложений командной строки в Linux, и те из них, которые имеют формат .deb или .rpms, особенно ценятся.
Ry4an Brase,

1
Первоначальное название гласило: GUI. Кроме того, если был запущен веб-запуск, можно поспорить, что это приложение с графическим интерфейсом. Наконец, утверждение, что пользователи Linux не используют приложения с графическим интерфейсом, полностью неверно.
Мэтт

Я не говорил, что люди с Linux не запускают приложения с графическим интерфейсом. Я сказал, что они не будут запускать приложения "Java GUI", и за пределами NetBeans и Eclipse (которые я рассмотрел в разделе "немногие, кто будет знать, что делать с исполняемым jar") я не могу придумать ни одного широко используемого Приложение Java в Linux (Open Office и т. Д. Являются C ++ и используют Java только для надстроек).
Ry4an Brase, 02

когда-нибудь слышали о SQLDeveloper? Или любой из инструментов управления оракулом? Все закодировано на java (хотя sqldeveloper в конечном итоге объединяется как .exe, но это java)
Мэтт

3

Хотя я не использовал NSIS (Nullsoft Scriptable Installer System), существуют сценарии установки, которые проверяют, установлена ​​ли необходимая JRE в целевой системе.

Многие образцы сценариев доступны на страницах Примеры кода и Реальные установщики , например:

(Обратите внимание, что я на самом деле не использовал ни один из скриптов, поэтому, пожалуйста, не воспринимайте это как одобрение.)


2

Мне нужен был способ упаковать мой проект и его зависимости в один файл jar.

Я нашел то, что мне нужно, с помощью плагина Maven2 Assembly: Maven2 Assembly Maven2 Assembly

Похоже, что это дублирует функциональность one-jar , но не требует дополнительной настройки для его работы.


1

Для простых приложений Java мне нравится использовать Jar's. Распространить один файл, на который пользователь может просто щелкнуть (Windows), или

java -jar jarname.jar

ИМХО, jar - это то, что нужно, когда простота является основным требованием.


Попробуйте это на новичках, и вы обнаружите, что это не сработает.
rhody

1

Я разрабатываю приложения Eclipse RCP. Обычно для запуска приложения eclipse включается исполняемый модуль запуска. Я включаю виртуальную машину Java в папку приложения в подкаталог / jre, чтобы гарантировать, что будет использоваться правильная версия Java.

Затем мы упаковываем Inno Setup для установки на машине пользователя.


1

Как лучше всего распространять приложение Java? Что, если приложению Java необходимо установить артефакты на компьютер пользователя? Существуют ли какие-нибудь хорошие системы установки / упаковки Java?

По моему опыту (по оценке ряда вариантов ) install4j - хорошее решение. Он создает собственные установщики для любой платформы и специально предназначен для установки приложений Java. Подробнее см. " Возможности » на его веб-сайте.

Однако install4j - это коммерческий инструмент. Особенно, если ваши потребности относительно просты (просто распространите приложение и установите некоторые артефакты), существует множество других хороших вариантов, включая бесплатные (например, izPack или уже упомянутый Lauch4j ). Но вы спросили лучший способ, и, насколько мне известно, install4j - это тот, который особенно подходит для распространения больших или более сложных приложений Java (EE).


Вы знаете, как заставить его запускать JVM 5.0 в Mac OS? С Windows вы просто связываете JRE, но на Mac возможно, что у них настроена другая JVM по умолчанию. Поэтому я не уверен, как явно заставить его использовать конкретную версию JVM, которую вы хотите ...
Стефан Гренье,

@Stephane, я на самом деле не создавал установщики OS X с помощью install4j, но я думаю, что это не должно быть проблемой, учитывая гибкие параметры связывания / обнаружения JRE, которые у него есть. Чтобы узнать о них больше, проверьте ссылки в этом ответе: stackoverflow.com/questions/995881/…
Джоник 06

Поскольку Mac поддерживает создание пакетов приложений Java, вы можете просто указать JRE в info.plist, например, так ... <key> JVMVersion </key> <string> 1.5+ </string> Вы можете удалить плюс, чтобы потребовать конкретную версию , Вот как я это делаю, но я не использую install4j. Есть множество страниц, объясняющих создание файлов Mac App в сети. Я также рекомендую просто посмотреть, как это делают limewire или vuze (Java-приложения). Вы также можете посмотреть сценарии сборки, которые они используют для сборки пакетов приложений и файлов dmg, поскольку они с открытым исходным кодом!
Cal

0

Лучший ответ зависит от платформы. Для развертывания в Windows у меня были хорошие результаты, используя комбинацию one-jar и launch4j . Мне потребовалось некоторое время, чтобы правильно настроить среду сборки (в основном скрипты муравьев), но теперь это довольно безболезненно.


0

Что ж, с моей точки зрения, лучший механизм распространения - это использование чего-то вроде ClickOnce или технологии WebStart . Вы просто развертываете версию на сервере, и она автоматически доставляется клиентам, когда версия выпускается. Платформа Eclipse RCP также содержит UpdateManager, который выполняет то же, что и WebStart, а также многое другое.

Поскольку я использую Maven2 для сборки, развертывание - это всего лишь кусок пирога: скопируйте созданный jar-файл в место на сервере, обновите файл jnlp, если необходимо, и все готово.


0

installanywhere хороший, но дорогой - я не нашел (как) хорошего бесплатного


См. Здесь альтернативы InstallAnywhere, включая некоторые бесплатные (а также коммерческие, которые по гораздо более разумной цене): stackoverflow.com/questions/759855/…
Джоник

-2

Я бы заархивировал файл jar вместе с другими зависимыми файлами jar, файлами конфигурации и документацией вместе с run.bat / run.sh. Конечный пользователь должен иметь возможность распаковать его в любое место и при необходимости отредактировать run.bat (в большинстве случаев он должен запускаться без редактирования). Установщик может быть полезен, если вы хотите создавать записи в меню «Пуск», на рабочем столе, в системном трее и т. Д.

Как пользователь, я предпочитаю распаковать и запустить установку (пожалуйста, без пунктов меню «Пуск»). Однако люди, не работающие в сфере ИТ, могут иметь другие предпочтения. Так что, если приложение в основном предназначено для разработчиков, маршрут zip-run.bat и приложения для широкой публики могут быть установлены с помощью установщика.


Это никогда не сработает для новичков.
rhody
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.