Qual è il modo migliore per distribuire le applicazioni Java? [chiuso]


115

Java è uno dei miei linguaggi di programmazione preferiti. Tuttavia, mi imbatto sempre nel problema di distribuire la mia applicazione agli utenti finali.

Dare a un utente un JAR non è sempre così facile da usare come vorrei e l'utilizzo di Java WebStart richiede la manutenzione di un server web.

Qual è il modo migliore per distribuire un'applicazione Java? Cosa succede se l'applicazione Java deve installare artefatti sul computer dell'utente? Esistono dei buoni sistemi di installazione / pacchettizzazione Java là fuori?


Java WebStart può essere utilizzato da qualsiasi URL come un file system come un CD o un'unità di rete. Certo, non ti dà tanto. Nota: eclipse non usa un programma di installazione, basta decomprimerlo ed eseguirlo. Forse non hai bisogno di un programma di installazione.
Peter Lawrey

1
Oggigiorno è molto semplice distribuire un'applicazione WebStart Java, ad esempio, su Google Application Engine.
Thorbjørn Ravn Andersen

6
È un peccato che questa domanda sia chiusa. Non sono d'accordo con la ragione dichiarata "principalmente basata sull'opinione". Le risposte fornite non si basano sull'opinione ma sull'esperienza. Accolgo sempre buone risposte basate sull'esperienza. Coloro che non possono imparare dalla storia sono condannati a ripeterlo.
bouvierr

È possibile utilizzare jlink (introdotto con JDK 9) per distribuire le app Java. Viene fornito con JDK. Costruirà un JRE dedicato per te. Non è necessario che java sia installato sulle macchine client.
blueray

Risposte:


89

Esistono diverse soluzioni, a seconda dei requisiti di distribuzione.

  1. Usa solo un barattolo. Ciò presuppone che l'utente abbia la versione Java corretta installata, altrimenti l'utente riceverà le eccezioni "versione file di classe". Questo va bene per la distribuzione interna all'interno di un'azienda.

  2. Usa launch4j e un programma di installazione come NSIS. Questo ti dà molto più controllo, sebbene l'utente possa ancora fare cose stupide come disinstallare il runtime java. Questo è probabilmente l'approccio più popolare e quello che uso attualmente.

  3. Usa Webstart. Ciò presuppone anche che l'utente abbia installato la versione Java corretta, ma è molto più facile iniziare. La mia esperienza è che questo va bene per ambienti intranet strettamente controllati, ma diventa un problema con distribuzioni più grandi perché ha molti strani errori. Potrebbe migliorare con la nuova tecnologia plug-in in Java 1.7.

  4. Usa un compilatore di codice nativo come Excelsior JET e distribuiscilo come eseguibile o inseriscilo in un programma di installazione. Costoso e generalmente ti lega a una versione leggermente più vecchia di java, e c'è qualche problema con il caricamento dinamico delle classi, ma è molto efficace per la distribuzione su larga scala in cui è necessario ridurre al minimo i problemi di supporto.


4
Solo una nota su Webstart: fintanto che l'utente ha una versione di Java installata che non è dell'età della pietra (es. 1.2), a webstart può essere detto di scaricare e installare una versione Java più recente di quella richiesta per il tuo programma non è presente ancora. Guarda la sintassi del file .jnlp. Ovviamente mostra ancora in modo abbastanza evidente che stai usando Java che potrebbe essere inappropriato a seconda dei client con cui hai a che fare. In questi casi dovresti davvero usare una sorta di formato di file / installazione "nativo" e nascondere il più possibile i dettagli di implementazione.
Daniel Schneller,

10
Non mi piace Webstart. Ha troppo marchio Java / Sun. È difficile farlo funzionare bene. L'impostazione della firma del codice è più un problema di quanto valga la pena e l'utente non comprende comunque i vantaggi e i messaggi di sicurezza. Se vuoi fare qualsiasi cosa sul sistema degli utenti, dovrai pagare per il tuo certificato di firma del codice per sbarazzarti degli allarmi spaventosi. Fa un sacco di caching complicato che può causare problemi. Forse OSGi oi prossimi moduli Java offriranno vantaggi di aggiornamento automatico simili. Uso una variazione di # 2 e creo DMG / Packager per mac tutto da Ant.
Cal

Ho usato NSIS come mi hai suggerito. Ho anche esaminato launch4j. Perché consigli di usarli entrambi?
jacknad

1
@JackN NSIS è un generatore di installazione. Launch4j è specifico per rendere più semplice l'avvio / l'avvio di programmi Java. C'è qualche sovrapposizione nelle loro funzionalità, ma sono mirate a diverse parti del problema.
Noel Grandin

+1 ottima risposta. Hai qualche esperienza con Excelsior JET? Supporta solo l'architettura x86 e non è in grado di caricare la libreria jar in tempo reale?
KJW

6

Il programma di installazione avanzato semplifica il pacchetto di app Java come eseguibili di Windows ed è abbastanza flessibile nel modo in cui puoi configurarlo. Ho scoperto che per la distribuzione di applicazioni Java ai client Windows, questo è il modo più semplice per procedere.


5

JSmooth è un semplice programma che prende il tuo jar e lo avvolge in un file eseguibile standard di Windows. Viene fornito con una semplice GUI che consente di configurare la JVM richiesta, integrarla con l'applicazione o fornire un'opzione per scaricarla se non è già installata. È possibile inviare il file exe così com'è o comprimerlo con eventuali dipendenze (o lasciare che il programma scarichi le dipendenze extra dalla rete all'avvio). È anche gratuito, come nella birra e nella parola, il che può (o non può) essere una buona cosa.


4

Dipende da quanto sono sofisticati i tuoi utenti target. Nella maggior parte dei casi si desidera isolarli dal fatto che si sta eseguendo un'app basata su Java. Dagli un programma di installazione nativo che fa la cosa giusta (crea voci del menu di avvio, lanciatori, registra con aggiungi / rimuovi programmi, ecc.) E già raggruppa un runtime Java (quindi l'utente non ha bisogno di conoscerlo o preoccuparsene). Vorrei suggerire il nostro strumento di installazione multipiattaforma, multipiattaforma BitRock InstallBuilder. Sebbene non sia basato su Java, è comunemente utilizzato per creare pacchetti di applicazioni Java. Può essere facilmente integrato con Ant e puoi creare programmi di installazione Windows da Unix / Linux / Mac e viceversa. Poiché i programmi di installazione generati sono nativi, non richiedono una fase di autoestrazione o un JRE per essere già presenti nel sistema di destinazione, il che significa installatori più piccoli e ti fa risparmiare qualche mal di testa. Vorrei anche menzionare che abbiamo licenze gratuite per progetti open source



3

Se si tratta di una vera applicazione per l'utente finale con GUI, ignorare la lingua in cui è stato scritto il programma (Java) e utilizzare un programma di installazione nativo per ciascuna delle piattaforme scelte. Le persone Mac vogliono un .dmg e su Windows un .msi o un .exe installer è la strada da percorrere. Su Windows preferisco NSIS di NullSoft solo perché è meno discutibile di InstallShield o InstallAnywhere. Su OSX puoi contare sul fatto che la JVM sia già presente. Su Windows dovrai controllarlo e installarlo per loro se necessario. Le persone Linux non eseguiranno applicazioni GUI Java, e le poche che lo faranno, sapranno cosa fare con un eseguibile .jar.


3
veramente? le persone Linux non eseguiranno applicazioni GUI? quindi immagino che il suo programma sia inutile per loro rendendo discutibile l'intera discussione.
Matt

@ Matt perché pensi che l'applicazione originale fosse un'applicazione GUI? Ho installato molte applicazioni java da riga di comando su Linux e quelle che arrivano come .deb o .rpms sono particolarmente apprezzate.
Ry4an Brase

1
Il titolo originale diceva GUI. Inoltre, se webstart è stato lanciato, è una buona scommessa che sia un'applicazione gui. Infine, dire che gli utenti Linux non usano le applicazioni GUI è del tutto falso.
Matt

Non ho detto che le persone Linux non eseguono applicazioni GUI. Ho detto che non eseguiranno applicazioni "Java GUI", e al di fuori di NetBeans ed Eclipse (che ho trattato sotto i "pochi che sapranno cosa fare con un jar eseguibile") non riesco a pensare a un singolo ampiamente utilizzato Applicazione Java su Linux (Open Office, ecc. Sono C ++ e utilizzano Java solo per i plugin).
Ry4an Brase

mai sentito parlare di SQLDeveloper? O uno qualsiasi degli strumenti di gestione Oracle? Tutto codificato in java (sebbene sqldeveloper finisca per essere raggruppato come .exe, ma è java)
Matt

3

Sebbene non abbia utilizzato NSIS (Nullsoft Scriptable Installer System) da solo, esistono script di installazione che controllano se il JRE richiesto è installato o meno sul sistema di destinazione.

Molti script di esempio sono disponibili nelle pagine degli esempi di codice e dei programmi di installazione del mondo reale , ad esempio:

(Tieni presente che in realtà non ho utilizzato nessuno degli script, quindi per favore non prenderlo come un'approvazione.)


2

Avevo bisogno di un modo per impacchettare il mio progetto e le sue dipendenze in un unico file jar.

Ho trovato ciò di cui avevo bisogno utilizzando il plug-in Maven2 Assembly : il plug-in Maven2 Assembly

Questo sembra duplicare la funzionalità di one-jar , ma non richiede alcuna configurazione aggiuntiva per farlo funzionare.


1

Per semplici app Java mi piace usare Jar's. È molto semplice distribuire un file su cui un utente può semplicemente fare clic (Windows) o

java -jar jarname.jar

IMHO, jar è la strada da percorrere quando la semplicità è un requisito principale.


Provalo sui neofiti e scoprirai che non funzionerà bene.
Rhody

1

Sviluppo applicazioni RCP eclipse. Normalmente per avviare un'applicazione eclipse è incluso un programma di avvio eseguibile. Includo la macchina virtuale java all'interno della cartella dell'applicazione in una sottodirectory / jre per assicurarmi che venga utilizzata la versione java corretta.

Quindi creiamo un pacchetto con Inno Setup per l'installazione sulla macchina dell'utente.


1

Qual è il modo migliore per distribuire un'applicazione Java? Cosa succede se l'applicazione Java deve installare artefatti sul computer dell'utente? Esistono dei buoni sistemi di installazione / pacchettizzazione Java là fuori?

Nella mia esperienza (dalla valutazione di una serie di opzioni ), install4j è una buona soluzione. Crea programmi di installazione nativi per qualsiasi piattaforma ed è specificamente orientato all'installazione di app Java. Per i dettagli, vedere " Funzionalità " sul suo sito web.

install4j è uno strumento commerciale, però. Soprattutto se le tue esigenze sono relativamente semplici (basta distribuire un'applicazione e installare alcuni artefatti), esistono molte altre buone opzioni, comprese quelle gratuite (come izPack o il già citato Lauch4j ). Ma hai chiesto il modo migliore e, per quanto ne so, install4j è quello, soprattutto per la distribuzione di app Java (EE) più grandi o più complicate.


Sai come forzare l'esecuzione di JVM 5.0 su Mac OS? Con Windows devi solo raggruppare il JRE, ma sul Mac è possibile che abbiano un'altra JVM predefinita configurata. Quindi non sono sicuro di come forzarlo esplicitamente a utilizzare la versione JVM specifica che desideri ...
Stephane Grenier

@Stephane, in realtà non ho creato programmi di installazione OS X utilizzando install4j, ma penso che non dovrebbe essere un problema date le opzioni di raggruppamento / rilevamento JRE flessibili che ha. Per più su di loro, controllare i link in questa risposta: stackoverflow.com/questions/995881/...
Jonik

Poiché il Mac supporta la creazione di bundle di app Java, puoi semplicemente specificare il JRE nel file info.plist in questo modo ... <key> JVMVersion </key> <string> 1.5+ </string> Puoi rimuovere il plus per richiedere una versione specifica . È così che lo faccio ma non uso install4j. Ci sono un sacco di pagine che spiegano come creare budles per Mac App sul web. Inoltre, consiglio di guardare come lo fanno limewire o vuze (app java). Puoi anche guardare gli script di compilazione che usano per creare gli app bundle ei file dmg poiché sono open source!
Cal

0

La risposta migliore dipende dalla piattaforma. Per la distribuzione su Windows, ho ottenuto buoni risultati utilizzando una combinazione di one-jar e launch4j . Ci è voluto un po 'di tempo per impostare correttamente il mio ambiente di compilazione (principalmente script di formiche) ma ora è abbastanza indolore.


0

Ebbene, dal mio punto di vista, il meccanismo di distribuzione superiore consiste nell'usare qualcosa come ClickOnce o la tecnologia WebStart . Devi solo distribuire la versione sul server e questa arriva automaticamente ai client quando la versione viene rilasciata. Anche la piattaforma Eclipse RCP contiene UpdateManager che fa quello che fa WebStart, ma anche molto altro.

Dato che sto usando Maven2 per la creazione, la distribuzione è solo un gioco da ragazzi: copia il jar creato nella posizione sul server, aggiorna il file jnlp se necessario e il gioco è fatto.


0

installare ovunque è buono ma costoso - non ne ho trovato uno buono gratuito


Vedere questo per le alternative InstallAnywhere, tra cui alcuni tra quelli liberi (così come quelle commerciali che sono molto di più a prezzi ragionevoli): stackoverflow.com/questions/759855/...
Jonik

-2

Vorrei comprimere il file jar insieme ad altri jar dipendenti, file di configurazione e documentazione insieme a run.bat / run.sh. L'utente finale dovrebbe essere in grado di decomprimerlo in qualsiasi posizione e modificare il file run.bat se necessario (dovrebbe essere eseguito senza modifiche nella maggior parte dei casi). Un programma di installazione può essere utile se desideri creare voci nel menu di avvio, desktop, barra delle applicazioni ecc.

Come utente preferisco decomprimere ed eseguire il tipo di installazione (nessuna voce del menu di avvio per favore). Tuttavia, le persone al di fuori del settore IT possono avere preferenze diverse. Quindi, se l'applicazione è in gran parte destinata agli sviluppatori, il percorso zip-run.bat e le applicazioni per il pubblico in generale possono essere installate utilizzando un programma di installazione.


Questo non funzionerà mai per i neofiti.
Rhody
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.