Was ist der beste Weg, um Java-Anwendungen zu verteilen? [geschlossen]

115

Java ist eine meiner bevorzugten Programmiersprachen. Ich habe immer das Problem, meine Anwendung an Endbenutzer zu verteilen.

Es ist nicht immer so benutzerfreundlich, einem Benutzer eine JAR zu geben, wie ich es gerne hätte. Für die Verwendung von Java WebStart muss ein Webserver gewartet werden.

Was ist der beste Weg, um eine Java-Anwendung zu verteilen? Was ist, wenn die Java-Anwendung Artefakte auf dem Computer des Benutzers installieren muss? Gibt es gute Java-Installations- / Verpackungssysteme?

Laplie Anderson
quelle
Java WebStart kann von jeder URL aus verwendet werden, z. B. von einem Dateisystem wie einer CD oder einem Netzwerklaufwerk. Zugegeben, es gibt dir nicht so viel. Hinweis: Eclipse verwendet kein Installationsprogramm. Sie entpacken es einfach und führen es aus. Vielleicht brauchen Sie keinen Installer.
Peter Lawrey
1
Heutzutage ist es sehr einfach, eine solche Java WebStart-Anwendung beispielsweise bei Google Application Engine bereitzustellen.
Thorbjørn Ravn Andersen
6
Es ist eine Schande, dass diese Frage geschlossen ist. Ich bin mit dem Grund nicht einverstanden, der als "hauptsächlich meinungsbasiert" angegeben wurde. Die Antworten basieren nicht auf Meinungen, sondern auf Erfahrungen. Ich freue mich immer über gute Antworten aus Erfahrung. Diejenigen, die nicht aus der Geschichte lernen können, sind dazu verdammt, sie zu wiederholen.
Bouvierr
Sie können jlink (eingeführt mit JDK 9) verwenden, um Java Apps zu verteilen. Es kommt mit dem JDK. Es wird eine dedizierte JRE für Sie erstellen. Java muss nicht auf Clientcomputern installiert sein.
blueray

Antworten:

89

Abhängig von Ihren Vertriebsanforderungen gibt es eine Vielzahl von Lösungen.

  1. Verwenden Sie einfach ein Glas. Dies setzt voraus, dass der Benutzer die richtige Java-Version installiert hat, andernfalls erhält der Benutzer Ausnahmen vom "Klassendateiformat". Dies ist in Ordnung für den internen Vertrieb innerhalb eines Unternehmens.

  2. Verwenden Sie launch4j und ein Installationsprogramm wie NSIS. Dies gibt Ihnen viel mehr Kontrolle, obwohl der Benutzer immer noch dumme Dinge tun kann, wie die Java-Laufzeit zu deinstallieren. Dies ist wahrscheinlich der beliebteste Ansatz und das, was ich derzeit verwende.

  3. Verwenden Sie Webstart. Dies setzt auch voraus, dass der Benutzer die richtige Java-Version installiert hat, aber es ist viel einfacher, loszulegen. Ich habe die Erfahrung gemacht, dass dies für streng kontrollierte Intranetumgebungen in Ordnung ist, bei größeren Bereitstellungen jedoch zu einem Problem wird, da es einige seltsame Fehler gibt. Mit der neuen Plug-In-Technologie in Java 1.7 wird es möglicherweise besser.

  4. Verwenden Sie einen nativen Code-Compiler wie Excelsior JET und verteilen Sie ihn als ausführbare Datei oder packen Sie ihn in ein Installationsprogramm. Teuer, und es bindet Sie im Allgemeinen an eine etwas ältere Version von Java, und es gibt einige Probleme beim dynamischen Laden von Klassen, aber es ist sehr effektiv für die Bereitstellung in großem Maßstab, bei der Sie Ihre Support-Probleme minimieren müssen.

Noel Grandin
quelle
4
Nur ein Hinweis zu Webstart: Solange der Benutzer eine Java-Version installiert hat, die nicht aus der Steinzeit stammt (z. B. 1.2), kann Webstart angewiesen werden, eine neuere Java-Version herunterzuladen und zu installieren, die Sie für Ihr Programm benötigen noch. Schauen Sie sich die Syntax der .jnlp-Datei an. Natürlich zeigt es immer noch deutlich, dass Sie Java verwenden, was je nach den Clients, mit denen Sie sich befassen, möglicherweise unangemessen ist. In diesen Fällen sollten Sie in der Tat eine Art "natives" Installations- / Dateiformat verwenden und die Implementierungsdetails so weit wie möglich ausblenden.
Daniel Schneller
10
Ich mag Webstart nicht. Es hat zu viel Java / Sun-Branding. Es ist schwer, es richtig zum Laufen zu bringen. Das Einrichten der Codesignatur ist schwieriger als es sich lohnt und der Benutzer versteht die Sicherheitsvorteile und -nachrichten sowieso nicht. Wenn Sie etwas auf dem Benutzersystem tun möchten, müssen Sie für Ihr Codesignaturzertifikat bezahlen, um die beängstigenden Warnungen zu beseitigen. Es führt viele komplizierte Zwischenspeicherungen durch, die Probleme verursachen können. Möglicherweise bieten OSGi oder kommende Java-Module ähnliche Vorteile für die automatische Aktualisierung. Ich benutze eine Variante von # 2 und erstelle DMG / Packager für Mac alle von Ant.
Cal
Ich habe NSIS verwendet, wie Sie vorgeschlagen haben. Ich habe mir auch launch4j angesehen. Warum empfehlen Sie beide?
Jacknad
1
@ JackN NSIS ist ein Installationsgenerator. Launch4j wurde speziell entwickelt, um das Starten / Starten von Java-Programmen zu vereinfachen. Es gibt einige Überschneidungen in ihrer Funktionalität, aber sie zielen auf verschiedene Teile des Problems ab.
Noel Grandin
+1 tolle Antwort. Haben Sie Erfahrung mit Excelsior JET? Unterstützt es nur die x86-Architektur und kann keine Echtzeit-JAR-Bibliothek laden?
KJW
6

Das erweiterte Installationsprogramm erleichtert das Packen von Java-Apps als ausführbare Windows-Dateien und ist sehr flexibel in der Art und Weise, wie Sie es einrichten können. Ich habe festgestellt, dass dies für die Verteilung von Java-Anwendungen an Windows-Clients der einfachste Weg ist.

rostig
quelle
5

JSmooth ist ein einfaches Programm, das Ihre JAR-Datei in eine ausführbare Windows-Standarddatei packt . Es wird mit einer einfachen Benutzeroberfläche geliefert, mit der Sie die erforderliche JVM konfigurieren, mit der Anwendung bündeln oder eine Option zum Herunterladen bereitstellen können, falls diese noch nicht installiert ist. Sie können die exe-Datei unverändert senden oder mit möglichen Abhängigkeiten komprimieren (oder das Programm die zusätzlichen Abhängigkeiten beim Start aus dem Netz herunterladen lassen). Es ist auch kostenlos, wie in Bier und Sprache, was eine gute Sache sein kann (oder auch nicht).

Stian
quelle
4

Dies hängt davon ab, wie anspruchsvoll Ihre Zielbenutzer sind. In den meisten Fällen möchten Sie sie von der Tatsache isolieren, dass Sie eine Java-basierte App ausführen. Geben Sie ihnen ein natives Installationsprogramm, das das Richtige tut (Startmenüeinträge erstellen, starten, sich bei Programmen zum Hinzufügen / Entfernen registrieren usw.) und bereits eine Java-Laufzeit bündelt (sodass der Benutzer dies nicht wissen oder sich nicht darum kümmern muss). Ich möchte unser plattformübergreifendes Installationstool vorschlagen. BitRock InstallBuilder vorschlagen. Obwohl es nicht Java-basiert ist, wird es häufig zum Packen von Java-Anwendungen verwendet. Es kann einfach in Ant integriert werden und Sie können Windows-Installationsprogramme unter Unix / Linux / Mac und umgekehrt erstellen. Da die generierten Installationsprogramme nativ sind, muss kein Selbstextraktionsschritt oder eine JRE bereits im Zielsystem vorhanden sein. Dies bedeutet kleinere Installationsprogramme und erspart Ihnen einige Kopfschmerzen. Ich möchte auch erwähnen, dass wir kostenlose Lizenzen für Open Source-Projekte haben

Daniel Lopez
quelle
3

Wenn es sich um eine echte GUI-Endbenutzeranwendung handelt, sollten Sie die Sprache, in der Sie das Programm geschrieben haben (Java), ignorieren und für jede der von Ihnen ausgewählten Plattformen ein natives Installationsprogramm verwenden. Mac-Leute wollen ein .dmg und unter Windows ist ein .msi oder ein .exe-Installationsprogramm der richtige Weg. Unter Windows bevorzuge ich NSIS von NullSoft nur, weil es weniger zu beanstanden ist als InstallShield oder InstallAnywhere. Unter OSX können Sie sich darauf verlassen, dass die JVM bereits vorhanden ist. Unter Windows müssen Sie es überprüfen und gegebenenfalls installieren. Linux-Benutzer werden keine Java-GUI-Anwendungen ausführen, und die wenigen, die dies tun, wissen, was mit einer ausführbaren JAR-Datei zu tun ist.

Ry4an Brase
quelle
3
Ja wirklich? Linux-Leute werden keine GUI-Anwendungen ausführen? dann denke ich, dass sein Programm für sie nutzlos ist, was die ganze Diskussion in Frage stellt.
Matt
@Matt, warum nehmen Sie an, dass die ursprüngliche Anwendung eine GUI-Anwendung war? Ich habe viele Befehlszeilen-Java-Anwendungen unter Linux installiert, und diejenigen, die als .deb oder .rpms herunterkommen, werden besonders geschätzt.
Ry4an Brase
1
Der ursprüngliche Titel sagte GUI. Wenn Webstart aufgerufen wurde, ist es eine gute Wette, dass es sich um eine GUI-Anwendung handelt. Zu sagen, dass Linux-Benutzer keine GUI-Anwendungen verwenden, ist völlig falsch.
Matt
Ich habe nicht gesagt, dass Linux-Leute keine GUI-Anwendungen ausführen. Ich sagte, dass sie keine "Java GUI" -Anwendungen ausführen werden, und außerhalb von NetBeans und Eclipse (die ich unter den "wenigen, die wissen, was mit einem ausführbaren JAR zu tun ist" behandelt habe) kann ich mir keine einzige weit verbreitete vorstellen Java-Anwendung unter Linux (Open Office usw. sind C ++ und verwenden Java nur für Plugins).
Ry4an Brase
Schon mal was von SQLDeveloper gehört? Oder eines der Orakel-Management-Tools? Alle in Java codiert (obwohl sqldeveloper als .exe gebündelt wird, aber es ist Java)
Matt
3

Obwohl ich NSIS nicht benutzt habe (Nullsoft Scriptable Installer System) verwendet habe, gibt es Installationsskripte, die prüfen, ob die erforderliche JRE auf dem Zielsystem installiert ist oder nicht.

Viele Beispielskripte sind von den Codebeispielen und Real World Installateure Seiten, wie zB:

(Bitte beachten Sie, dass ich keines der Skripte tatsächlich verwendet habe. Nehmen Sie es daher bitte nicht als Bestätigung.)

Coobird
quelle
2

Ich brauchte eine Möglichkeit, mein Projekt und seine Abhängigkeiten in eine einzige JAR-Datei zu packen.

Mit dem Maven2 Assembly Plugin habe ich gefunden, was ich brauchte: Maven2 Assembly Plugin

Dies scheint die Funktionalität von one-jar zu duplizieren , erfordert jedoch keine zusätzliche Konfiguration, um es zum Laufen zu bringen.

David Carlson
quelle
1

Für einfache Java-Apps verwende ich gerne Jar's. Es ist sehr einfach, eine Datei zu verteilen, auf die ein Benutzer einfach klicken kann (Windows) oder

java -jar jarname.jar

IMHO, Glas ist der richtige Weg, wenn Einfachheit eine Hauptanforderung ist.

jjnguy
quelle
Versuchen Sie dies bei Neulingen und Sie werden feststellen, dass es nicht gut funktioniert.
Rhody
1

Ich entwickle Eclipse RCP-Anwendungen. Normalerweise ist zum Starten einer Eclipse-Anwendung ein ausführbarer Launcher enthalten. Ich füge die Java Virtual Machine in den Anwendungsordner in einem / jre-Unterverzeichnis ein, um sicherzustellen, dass die richtige Java-Version verwendet wird.

Anschließend verpacken wir mit Inno Setup die Installation auf dem Computer des Benutzers.

Mario Ortegón
quelle
1

Was ist der beste Weg, um eine Java-Anwendung zu verteilen? Was ist, wenn die Java-Anwendung Artefakte auf dem Computer des Benutzers installieren muss? Gibt es gute Java-Installations- / Verpackungssysteme?

Nach meiner Erfahrung (aus der Bewertung einer Reihe von Optionen ) ist install4j eine gute Lösung. Es erstellt native Installationsprogramme für jede Plattform und ist speziell auf die Installation von Java-Apps ausgerichtet. Weitere Informationen finden Sie unter " Funktionen " auf der Website.

install4j ist jedoch ein kommerzielles Tool. Insbesondere wenn Ihre Anforderungen relativ einfach sind (verteilen Sie einfach eine Anwendung und installieren Sie einige Artefakte), gibt es viele andere gute Optionen, einschließlich kostenloser (wie izPack oder das bereits erwähnte Lauch4j ). Aber Sie haben nach dem besten Weg gefragt , und meines Wissens ist install4j derjenige, insbesondere für die Verteilung größerer oder komplizierterer Java (EE) -Apps.

Jonik
quelle
Wissen Sie, wie Sie die Ausführung von JVM 5.0 unter Mac OS erzwingen können? Mit Windows bündeln Sie nur die JRE, aber auf dem Mac ist möglicherweise eine andere Standard-JVM konfiguriert. Ich bin mir also nicht sicher, wie ich es explizit zwingen soll, die gewünschte JVM-Version zu verwenden ...
Stephane Grenier
@Stephane, ich habe noch keine OS X-Installationsprogramme mit install4j erstellt, aber ich denke, dass dies angesichts der flexiblen JRE-Bündelungs- / Erkennungsoptionen kein Problem sein sollte. Weitere Informationen finden
Jonik
Da Mac das Erstellen von Java-App-Bundles unterstützt, können Sie die JRE einfach wie folgt in der info.plist angeben ... <key> JVMVersion </ key> <string> 1.5+ </ string> Sie können das Plus entfernen, um eine bestimmte Version zu benötigen . So mache ich das, aber ich benutze install4j nicht. Es gibt eine Reihe von Seiten, auf denen das Erstellen von Mac App-Budles im Web erläutert wird. Ich empfehle auch, nur zu sehen, wie Limewire oder Vuze (Java-Apps) das machen. Sie können sich auch die Build-Skripte ansehen, mit denen die App-Bundles und DMG-Dateien erstellt werden, da sie Open Source sind!
Cal
0

Die beste Antwort hängt von der Plattform ab. Für die Bereitstellung unter Windows habe ich mit einer Kombination aus One-Jar und launch4j gute Ergebnisse erzielt . Es hat eine Weile gedauert, bis meine Build-Umgebung richtig eingerichtet war (meistens Ant-Skripte), aber jetzt ist es ziemlich schmerzlos.

qualidafial
quelle
0

Aus meiner Sicht besteht der überlegene Verteilungsmechanismus darin, etwas wie ClickOnce oder WebStart- Technologie zu verwenden. Sie stellen die Version einfach auf dem Server bereit und sie wird automatisch an die Clients gesendet, wenn die Version veröffentlicht wird. Die Eclipse RCP-Plattform enthält auch UpdateManager, der genau das tut, was WebStart tut, aber noch viel mehr.

Da ich Maven2 zum Erstellen verwende, ist die Bereitstellung nur ein Kinderspiel: Kopieren Sie das erstellte JAR an den Speicherort auf dem Server, aktualisieren Sie die JNLP-Datei bei Bedarf, und Sie sind fertig.

Petr Macek
quelle
0

installanywhere ist gut, aber teuer - ich habe keine (als) gute kostenlose gefunden

Tom
quelle
Hier finden Sie InstallAnywhere-Alternativen, einschließlich einiger kostenloser (sowie kommerzieller, preisgünstigerer) Alternativen
Jonik
-2

Ich würde die JAR-Datei zusammen mit anderen abhängigen JARs, Konfigurationsdateien und Dokumentationen zusammen mit einer run.bat / run.sh komprimieren. Der Endbenutzer sollte in der Lage sein, es an einen beliebigen Ort zu entpacken und die run.bat bei Bedarf zu bearbeiten (sie sollte in den meisten Fällen ohne Bearbeitung ausgeführt werden). Ein Installationsprogramm kann hilfreich sein, wenn Sie Einträge im Startmenü, auf dem Desktop, in der Taskleiste usw. erstellen möchten.

Als Benutzer bevorzuge ich das Entpacken und Ausführen einer Installation (bitte keine Startmenüeinträge). Personen außerhalb der IT-Branche haben jedoch möglicherweise andere Vorlieben. Wenn die Anwendung hauptsächlich für Entwickler bestimmt ist, können zip-run.bat route und Anwendungen für die breite Öffentlichkeit mithilfe eines Installationsprogramms installiert werden.

Rejeev Divakaran
quelle
Dies wird niemals für Neulinge funktionieren.
Rhody