Quelle est la meilleure façon de distribuer des applications Java? [fermé]

115

Java est l'un de mes langages de programmation de choix. Je rencontre toujours le problème de la distribution de mon application aux utilisateurs finaux.

Donner à un utilisateur un JAR n'est pas toujours aussi convivial que je le souhaiterais et utiliser Java WebStart nécessite que je gère un serveur Web.

Quelle est la meilleure façon de distribuer une application Java? Que faire si l'application Java doit installer des artefacts sur l'ordinateur de l'utilisateur? Existe-t-il de bons systèmes d'installation / d'empaquetage Java?

Laplie Anderson
la source
Java WebStart peut être utilisé sur n'importe quelle URL, comme un système de fichiers comme un CD ou un lecteur réseau. Certes, cela ne vous donne pas autant. Remarque: eclipse n'utilise pas d'installation, il suffit de le décompresser et de l'exécuter. Vous n'avez peut-être pas besoin d'un installateur.
Peter Lawrey
1
De nos jours, il est très simple de déployer une telle application Java WebStart sur, par exemple, Google Application Engine.
Thorbjørn Ravn Andersen
6
C'est dommage que cette question soit close. Je ne suis pas d'accord avec la raison invoquée «comme principalement basée sur l'opinion». Les réponses fournies ne sont pas basées sur des opinions mais sur l'expérience. J'accueille toujours les bonnes réponses basées sur l'expérience. Ceux qui ne peuvent pas apprendre de l'histoire sont condamnés à la répéter.
bouvierr
Vous pouvez utiliser jlink (introduit avec JDK 9) pour distribuer des applications Java. Il est livré avec le JDK. Il créera un JRE dédié pour vous. Vous n'avez pas besoin d'installer java sur les machines clientes.
blueray

Réponses:

89

Il existe une variété de solutions, en fonction de vos besoins de distribution.

  1. Utilisez simplement un pot. Cela suppose que l'utilisateur a installé la bonne version de Java, sinon l'utilisateur obtiendra des exceptions "version de format de fichier de classe". C'est parfait pour la distribution interne au sein d'une entreprise.

  2. Utilisez launch4j et un programme d'installation comme NSIS. Cela vous donne beaucoup plus de contrôle, bien que l'utilisateur puisse toujours faire des choses stupides comme la désinstallation du runtime java. C'est probablement l'approche la plus populaire et celle que j'utilise actuellement.

  3. Utilisez Webstart. Cela suppose également que l'utilisateur a installé la bonne version de Java, mais il est beaucoup plus facile de commencer. Mon expérience est que c'est bien pour les environnements intranet étroitement contrôlés, mais cela devient un problème avec des déploiements plus importants car il présente de nombreux échecs étranges. Cela pourrait s'améliorer avec la nouvelle technologie de plug-in de Java 1.7.

  4. Utilisez un compilateur de code natif comme Excelsior JET et distribuez-le en tant qu'exécutable, ou enveloppez-le dans un programme d'installation. Coûteux, et il vous lie généralement à une version légèrement plus ancienne de java, et le chargement de classe dynamique pose un problème, mais il est très efficace pour un déploiement à grande échelle où vous devez minimiser vos tracas de support.

Noel Grandin
la source
4
Juste une note sur Webstart: tant que l'utilisateur a installé une version de Java qui n'est pas de l'âge de pierre (par exemple 1.2), on peut dire à Webstart de télécharger et d'installer une version Java plus récente de celle dont vous avez besoin pour votre programme n'est pas là encore. Regardez la syntaxe du fichier .jnlp. Bien sûr, cela indique toujours que vous utilisez Java, ce qui peut être inapproprié selon les clients avec lesquels vous traitez. Dans ces cas, vous devriez en effet une sorte de format d'installation / fichier "natif" et masquer les détails d'implémentation autant que possible.
Daniel Schneller
10
Je n'aime pas Webstart. Il a trop de marque Java / Sun. Il est difficile de le faire fonctionner correctement. La configuration de la signature du code est plus problématique qu'elle n'en vaut la peine et l'utilisateur ne comprend de toute façon pas les avantages de sécurité et les messages. Si vous voulez faire quelque chose sur le système des utilisateurs, vous devrez payer votre certificat de signature de code pour vous débarrasser des avertissements effrayants.Il fait beaucoup de mise en cache compliquée qui peut causer des problèmes. Peut-être qu'OSGi ou les prochains modules Java offriront des avantages similaires de mise à jour automatique. J'utilise une variante de # 2 et crée DMG / Packager pour mac à partir de Ant.
Cal
J'ai utilisé NSIS comme vous l'avez suggéré. J'ai également regardé launch4j. Pourquoi recommandez-vous d'utiliser les deux?
jacknad
1
@JackN NSIS est un générateur d'installation. Launch4j est spécifiquement pour faciliter le lancement / démarrage des programmes java. Il y a un certain chevauchement dans leurs fonctionnalités, mais elles sont ciblées sur différentes parties du problème.
Noel Grandin
+1 excellente réponse. Avez-vous une expérience avec Excelsior JET? Prend-il uniquement en charge l'architecture x86 et est-il incapable de charger la bibliothèque jar en temps réel?
KJW
6

Le programme d'installation avancé facilite le package d'applications Java en tant qu'exécutables Windows, et il est assez flexible dans la façon dont vous pouvez le configurer. J'ai trouvé que pour distribuer des applications Java aux clients Windows, c'est la façon la plus simple de procéder.

rouille
la source
5

JSmooth est un programme simple qui prend votre jar et l'enveloppe dans un fichier exécutable Windows standard. Il est livré avec une interface graphique simple qui vous permet de configurer la JVM requise, de l'associer à l'application ou de fournir une option pour la télécharger si elle n'est pas déjà installée. Vous pouvez envoyer le fichier exe tel quel ou le compresser avec les dépendances possibles (ou laisser le programme télécharger les dépendances supplémentaires à partir du net au démarrage). C'est aussi gratuit, comme dans la bière et la parole, ce qui peut (ou non) être une bonne chose.

stian
la source
4

Cela dépend de la sophistication de vos utilisateurs cibles. Dans la plupart des cas, vous souhaitez les isoler du fait que vous exécutez une application Java. Donnez-leur un programme d'installation natif qui fait ce qu'il faut (créer des entrées de menu de démarrage, des lanceurs, vous inscrire avec des programmes d'ajout / de suppression, etc.) et qui regroupe déjà un runtime Java (de sorte que l'utilisateur n'a pas besoin de le savoir ou de s'en soucier). Je voudrais suggérer notre outil d'installation multiplateforme, BitRock InstallBuilder. Bien qu'il ne soit pas basé sur Java, il est couramment utilisé pour empaqueter des applications Java. Il peut être facilement intégré à Ant et vous pouvez créer des installateurs Windows à partir d'Unix / Linux / Mac et inversement. Étant donné que les programmes d'installation générés sont natifs, ils ne nécessitent pas d'étape d'auto-extraction ou un JRE pour être déjà présent dans le système cible, ce qui signifie des installateurs plus petits et vous évite quelques maux de tête. Je voudrais également mentionner que nous avons des licences gratuites pour les projets open source

Daniel Lopez
la source
3

S'il s'agit d'une véritable application utilisateur avec interface graphique, vous devez ignorer la langue dans laquelle vous avez écrit le programme (Java) et utiliser un installateur natif pour chacune de vos plates-formes choisies. Les Mac veulent un .dmg et sur Windows un programme d'installation .msi ou .exe est la solution. Sous Windows, je préfère NSIS à NullSoft uniquement parce que c'est moins répréhensible que InstallShield ou InstallAnywhere. Sur OSX, vous pouvez compter sur la JVM déjà présente. Sous Windows, vous devrez le vérifier et l'installer pour eux si nécessaire. Les utilisateurs de Linux n'exécuteront pas les applications Java GUI, et les rares qui le feront sauront quoi faire avec un exécutable .jar.

Ry4an Brase
la source
3
vraiment? les gens de Linux ne vont pas exécuter des applications gui? alors je suppose que son programme est inutile pour eux, ce qui rend toute la discussion sans objet.
Matt
@Matt pourquoi pensez-vous que l'application d'origine était une application GUI? J'ai installé de nombreuses applications java en ligne de commande sur Linux, et celles qui se présentent sous la forme .deb ou .rpms sont particulièrement appréciées.
Ry4an Brase
1
Le titre original disait GUI. De plus, si Webstart a été évoqué, il y a fort à parier qu'il s'agit d'une application d'interface graphique. Enfin, dire que les utilisateurs Linux n'utilisent pas les applications GUI est totalement faux.
Matt
Je n'ai pas dit que les utilisateurs de Linux n'exécutaient pas d'applications GUI. J'ai dit qu'ils ne lanceraient pas d'applications "Java GUI", et en dehors de NetBeans et Eclipse (que j'ai abordé sous le "quelques-uns qui sauront quoi faire avec un fichier exécutable"), je ne peux pas penser à un seul largement utilisé Application Java sur Linux (Open Office, etc. sont C ++ et n'utilisent Java que pour les plugins).
Ry4an Brase le
déjà entendu parler de SQLDeveloper? Ou l'un des outils de gestion d'Oracle? Tous codés en java (bien que sqldeveloper finisse par être fourni en tant que .exe, mais c'est java)
Matt
3

Bien que je n'ai pas utilisé moi-même NSIS (Nullsoft Scriptable Installer System), il existe des scripts d'installation qui vérifieront si le JRE requis est installé sur le système cible.

De nombreux exemples de scripts sont disponibles sur les pages Exemples de code et Installateurs du monde réel , tels que:

(Veuillez noter que je n'ai utilisé aucun des scripts, alors ne le prenez pas comme une approbation.)

coobird
la source
2

J'avais besoin d'un moyen de regrouper mon projet et ses dépendances dans un seul fichier jar.

J'ai trouvé ce dont j'avais besoin en utilisant le plugin Maven2 Assembly : plugin Maven2 Assembly

Cela semble dupliquer la fonctionnalité de one-jar , mais ne nécessite aucune configuration supplémentaire pour le faire fonctionner.

David Carlson
la source
1

Pour les applications Java simples, j'aime utiliser Jar's. Il est très simple de distribuer un fichier sur lequel un utilisateur peut simplement cliquer (Windows), ou

java -jar jarname.jar

À mon humble avis, le pot est la voie à suivre lorsque la simplicité est une exigence principale.

jjnguy
la source
Essayez ceci sur les débutants et vous constaterez que cela ne fonctionnera pas bien.
rhody
1

Je développe des applications eclipse RCP. Normalement, pour démarrer une application eclipse, un lanceur exécutable est inclus. J'inclus la machine virtuelle java dans le dossier de l'application dans un sous-répertoire / jre pour m'assurer que la bonne version de java sera utilisée.

Ensuite, nous emballons avec Inno Setup pour l'installation sur la machine de l'utilisateur.

Mario Ortegón
la source
1

Quelle est la meilleure façon de distribuer une application Java? Que faire si l'application Java doit installer des artefacts sur l'ordinateur de l'utilisateur? Existe-t-il de bons systèmes d'installation / d'empaquetage Java?

D'après mon expérience (après avoir évalué un certain nombre d'options ), install4j est une bonne solution. Il crée des installateurs natifs pour n'importe quelle plate-forme et est spécifiquement conçu pour installer des applications Java. Pour plus de détails, voir " Fonctionnalités » sur son site Web.

install4j est cependant un outil commercial. Surtout si vos besoins sont relativement simples (il suffit de distribuer une application et d'installer quelques artefacts), de nombreuses autres bonnes options existent, y compris des options gratuites (comme izPack ou le Lauch4j déjà mentionné ). Mais vous avez demandé le meilleur moyen, et à ma connaissance actuelle, install4j est celui-là, en particulier pour la distribution d'applications Java (EE) plus grandes ou plus complexes.

Jonik
la source
Savez-vous comment le forcer à exécuter JVM 5.0 sur Mac OS? Avec Windows, vous regroupez simplement le JRE, mais sur le mac, il est possible qu'ils aient une autre JVM par défaut configurée. Je ne sais donc pas comment le forcer explicitement à utiliser la version JVM spécifique que vous souhaitez ...
Stephane Grenier
@Stephane, je n'ai pas réellement créé d'installateurs OS X en utilisant install4j, mais je pense que cela ne devrait pas être un problème étant donné les options flexibles de regroupement / détection de JRE dont il dispose. Pour plus d'informations à leur sujet, consultez les liens dans cette réponse: stackoverflow.com/questions/995881/…
Jonik
Étant donné que Mac prend en charge la création de bundles d'applications Java, vous pouvez simplement spécifier le JRE dans info.plist comme ceci ... <key> JVMVersion </key> <string> 1.5+ </string> Vous pouvez supprimer le plus pour exiger une version spécifique . C'est comme ça que je le fais mais je n'utilise pas install4j. Il y a un tas de pages expliquant la création de budles Mac App sur le Web. Je recommande également de regarder simplement comment limewire ou vuze (applications java) le font. Vous pouvez également consulter les scripts de construction qu'ils utilisent pour créer les bundles d'applications et les fichiers dmg, car ils sont open source!
Cal
0

La meilleure réponse dépend de la plateforme. Pour le déploiement sur Windows, j'ai eu de bons résultats en utilisant une combinaison de one-jar et launch4j . Il a fallu un peu de temps pour configurer correctement mon environnement de construction (scripts ant, principalement), mais maintenant c'est assez indolore.

qualidafial
la source
0

Eh bien, de mon point de vue, le mécanisme de distribution supérieur consiste à utiliser quelque chose comme ClickOnce ou la technologie WebStart . Il vous suffit de déployer la version sur le serveur et elle est automatiquement transmise aux clients lorsque la version est publiée. La plate-forme Eclipse RCP contient également UpdateManager qui fait ce que WebStart fait, mais aussi bien plus encore.

Puisque j'utilise Maven2 pour la construction, le déploiement n'est qu'un jeu d'enfant: copiez le fichier jar construit à l'emplacement sur le serveur, mettez à jour le fichier jnlp si nécessaire et vous avez terminé.

Petr Macek
la source
0

installanywhere est bon mais cher - je n'ai pas trouvé (aussi) bon gratuit

À M
la source
Voir ceci pour les alternatives InstallAnywhere, y compris certaines gratuites (ainsi que celles commerciales dont le prix est beaucoup plus raisonnable): stackoverflow.com/questions/759855/…
Jonik
-2

Je compresserais le fichier jar avec d'autres jars dépendants, des fichiers de configuration et de la documentation avec un run.bat / run.sh. L'utilisateur final doit pouvoir le décompresser à n'importe quel emplacement et modifier le run.bat si nécessaire (il doit s'exécuter sans modification dans la plupart des cas). Un programme d'installation peut être utile si vous souhaitez créer des entrées dans le menu Démarrer, le bureau, la barre d'état système, etc.

En tant qu'utilisateur, je préfère décompresser et exécuter le type d'installation (pas d'entrées dans le menu Démarrer s'il vous plaît). Cependant, les personnes extérieures à l'industrie informatique peuvent avoir des préférences différentes. Donc, si l'application est largement destinée aux développeurs, la route zip-run.bat et les applications grand public peuvent être installées à l'aide d'un programme d'installation.

Rejeev Divakaran
la source
Cela ne fonctionnera jamais pour les débutants.
rhody