¿Cuál es la mejor forma de distribuir aplicaciones Java? [cerrado]

115

Java es uno de mis lenguajes de programación de elección. Aunque siempre me encuentro con el problema de distribuir mi aplicación a los usuarios finales.

Darle a un usuario un JAR no siempre es tan fácil de usar como me gustaría y el uso de Java WebStart requiere que yo mantenga un servidor web.

¿Cuál es la mejor forma de distribuir una aplicación Java? ¿Qué sucede si la aplicación Java necesita instalar artefactos en la computadora del usuario? ¿Existe algún buen sistema de instalación / empaquetado de Java?

Laplie Anderson
fuente
Java WebStart se puede utilizar fuera de cualquier URL, como un sistema de archivos como un CD o una unidad de red. De acuerdo, no te da tanto. Nota: eclipse no usa un instalador, simplemente descomprímalo y ejecútelo. Quizás no necesite un instalador.
Peter Lawrey
1
En estos días, es muy sencillo implementar una aplicación Java WebStart en, por ejemplo, Google Application Engine.
Thorbjørn Ravn Andersen
6
Es una pena que esta pregunta esté cerrada. No estoy de acuerdo con la razón declarada "principalmente basada en opiniones". Las respuestas proporcionadas no se basan en opiniones sino en experiencias. Siempre agradezco las buenas respuestas basadas en la experiencia. Aquellos que no pueden aprender de la historia están condenados a repetirla.
bouvierr
Puede utilizar jlink (introducido con JDK 9) para distribuir aplicaciones Java. Viene con el JDK. Construirá un JRE dedicado para usted. No es necesario tener Java instalado en las máquinas cliente.
blueray

Respuestas:

89

Existe una variedad de soluciones, según sus requisitos de distribución.

  1. Solo usa un frasco. Esto supone que el usuario tiene instalada la versión correcta de Java, de lo contrario, el usuario obtendrá excepciones de "versión de formato de archivo de clase". Esto está bien para la distribución interna dentro de una empresa.

  2. Utilice launch4j y un instalador como NSIS. Esto le da mucho más control, aunque el usuario aún puede hacer cosas estúpidas como desinstalar el tiempo de ejecución de Java. Este es probablemente el enfoque más popular y el que utilizo actualmente.

  3. Utilice Webstart. Esto también supone que el usuario tiene instalada la versión correcta de Java, pero es mucho más fácil comenzar. Mi experiencia es que esto está bien para entornos de intranet estrictamente controlados, pero se vuelve un problema con implementaciones más grandes porque tiene algunas fallas extrañas. Puede mejorar con la nueva tecnología de complementos en Java 1.7.

  4. Utilice un compilador de código nativo como Excelsior JET y distribúyalo como ejecutable, o envuélvalo en un instalador. Caro, y generalmente lo vincula a una versión un poco más antigua de java, y hay algunos problemas con la carga de clases dinámica, pero es muy efectivo para implementaciones a gran escala donde necesita minimizar sus problemas de soporte.

Noel Grandin
fuente
4
Solo una nota sobre Webstart: siempre que el usuario tenga instalada una versión de Java que no sea de la edad de piedra (por ejemplo, 1.2), se le puede indicar a webstart que descargue e instale una versión más reciente de Java de la que necesita para su programa. todavía. Mire la sintaxis del archivo .jnlp. Por supuesto, todavía muestra de manera bastante prominente que está utilizando Java, lo que podría ser inapropiado según los clientes con los que trate. En esos casos, debería utilizar algún tipo de formato de archivo / instalador "nativo" y ocultar los detalles de implementación en la medida de lo posible.
Daniel Schneller
10
No me gusta Webstart. Tiene demasiada marca Java / Sun. Es difícil hacer que funcione correctamente. Configurar la firma del código es más problemático de lo que vale y el usuario no comprende los mensajes y beneficios de seguridad de todos modos. Si desea hacer algo en el sistema de los usuarios, tendrá que pagar su certificado de firma de código para deshacerse de las advertencias aterradoras. Realiza un almacenamiento en caché muy complicado que puede causar problemas. Quizás OSGi o los próximos módulos de Java ofrezcan beneficios de actualización automática similares. Utilizo una variación del n. ° 2 y creo DMG / Packager para mac, todo desde Ant.
Cal
Usé NSIS como sugirió. También miré a launch4j. ¿Por qué recomienda usar ambos?
jacknad
1
@JackN NSIS es un generador de instaladores. Launch4j es específicamente para facilitar el lanzamiento / inicio de programas java. Existe cierta superposición en su funcionalidad, pero están dirigidas a diferentes partes del problema.
Noel Grandin
+1 gran respuesta. ¿Tiene alguna experiencia con Excelsior JET? ¿Solo es compatible con la arquitectura x86 y no puede cargar la biblioteca jar en tiempo real?
KJW
6

El instalador avanzado facilita el empaquetado de aplicaciones java como ejecutables de Windows, y es bastante flexible en la forma en que puede configurarlo. Descubrí que para distribuir aplicaciones Java a clientes de Windows, esta es la forma más fácil de hacerlo.

estantería oxidada
fuente
5

JSmooth es un programa simple que toma su jar y lo envuelve en un archivo ejecutable estándar de Windows. Viene con una GUI simple que le permite configurar la JVM requerida, empaquetarla con la aplicación o proporcionar una opción para descargarla si aún no está instalada. Puede enviar el archivo exe como está o comprimirlo con posibles dependencias (o dejar que el programa descargue las dependencias adicionales de la red al inicio). También es gratis, como en la cerveza y el habla, lo que puede (o no) ser algo bueno.

stian
fuente
4

Depende de lo sofisticados que sean sus usuarios objetivo. En la mayoría de los casos, desea aislarlos del hecho de que está ejecutando una aplicación basada en Java. Proporciónelos con un instalador nativo que haga lo correcto (crear entradas del menú de inicio, lanzadores, registrarse con agregar / quitar programas, etc.) y que ya incluya un tiempo de ejecución de Java (por lo que el usuario no necesita saberlo ni preocuparse por él). Me gustaría sugerir nuestra herramienta de instalación multiplataforma, BitRock InstallBuilder. Aunque no está basado en Java, se usa comúnmente para empaquetar aplicaciones Java. Puede integrarse fácilmente con Ant y puede crear instaladores de Windows desde Unix / Linux / Mac y viceversa. Debido a que los instaladores generados son nativos, no requieren un paso de autoextracción o que un JRE ya esté presente en el sistema de destino, lo que significa instaladores más pequeños y le ahorra algunos dolores de cabeza. También me gustaría mencionar que tenemos licencias gratuitas para proyectos de código abierto.

Daniel Lopez
fuente
3

Si se trata de una aplicación de usuario final con GUI real, debe ignorar el idioma en el que escribió el programa (Java) y usar un instalador nativo para cada una de las plataformas elegidas. La gente de Mac quiere un .dmg y en Windows un instalador .msi o .exe es el camino a seguir. En Windows, prefiero NSIS de NullSoft solo porque es menos objetable que InstallShield o InstallAnywhere. En OSX, puede contar con que la JVM ya estará allí. En Windows, deberá verificarlo e instalarlo si es necesario. La gente de Linux no ejecutará aplicaciones Java GUI, y los pocos que lo harán, sabrán qué hacer con un .jar ejecutable.

Ry4an Brase
fuente
3
¿De Verdad? ¿La gente de Linux no ejecuta aplicaciones de interfaz gráfica de usuario? entonces supongo que su programa es inútil para ellos haciendo que toda la discusión sea discutible.
Matt
@Matt, ¿por qué asume que la aplicación original era una aplicación GUI? He instalado muchas aplicaciones java de línea de comandos en Linux, y las que vienen como .deb o .rpms son especialmente apreciadas.
Ry4an Brase
1
El título original decía GUI. Además, si se ha creado webstart, es una buena apuesta que es una aplicación de interfaz gráfica de usuario. Finalmente, decir que los usuarios de Linux no usan aplicaciones GUI es completamente falso.
Matt
No dije que la gente de Linux no ejecute aplicaciones GUI. Dije que no ejecutarán aplicaciones "Java GUI", y fuera de NetBeans y Eclipse (que cubrí en los "pocos que sabrán qué hacer con un jar ejecutable") no puedo pensar en un solo uso ampliamente Aplicación Java en Linux (Open Office, etc. son C ++ y usan Java solo para complementos).
Ry4an Brase
¿Has oído hablar de SQLDeveloper? ¿O alguna de las herramientas de administración de Oracle? Todo codificado en java (aunque sqldeveloper termina empaquetado como un .exe, pero es java)
Matt
3

Aunque no he utilizado NSIS (Nullsoft Scriptable Installer System), existen scripts de instalación que comprobarán si el JRE requerido está instalado en el sistema de destino.

Hay muchos scripts de muestra disponibles en las páginas de ejemplos de código e instaladores del mundo real , como:

(Tenga en cuenta que en realidad no he usado ninguno de los guiones, así que no lo tome como un respaldo).

coobird
fuente
2

Necesitaba una forma de empaquetar mi proyecto y sus dependencias en un solo archivo jar.

Encontré lo que necesitaba usando el complemento Maven2 Assembly: Maven2 Assembly Maven2 Assembly plugin

Esto parece duplicar la funcionalidad de one-jar , pero no requiere configuración adicional para que funcione .

David Carlson
fuente
1

Para aplicaciones simples de Java, me gusta usar Jar's. Es muy sencillo distribuir un archivo en el que un usuario puede hacer clic (Windows), o

java -jar jarname.jar

En mi humilde opinión, jar es el camino a seguir cuando la simplicidad es un requisito principal.

jjnguy
fuente
Pruebe esto con los novatos y verá que no funcionará bien.
rhody
1

Desarrollo aplicaciones de eclipse RCP. Normalmente, para iniciar una aplicación de eclipse se incluye un lanzador ejecutable. Incluyo la máquina virtual Java dentro de la carpeta de la aplicación en un subdirectorio / jre para asegurarme de que se utilizará la versión correcta de Java.

Luego empaquetamos con Inno Setup para instalarlo en la máquina del usuario.

Mario Ortegón
fuente
1

¿Cuál es la mejor forma de distribuir una aplicación Java? ¿Qué sucede si la aplicación Java necesita instalar artefactos en la computadora del usuario? ¿Existe algún buen sistema de instalación / empaquetado de Java?

En mi experiencia (al evaluar varias opciones ), install4j es una buena solución. Crea instaladores nativos para cualquier plataforma y está específicamente orientado a la instalación de aplicaciones Java. Para obtener más información, consulte " Funciones " en su sitio web.

install4j es una herramienta comercial. Especialmente si tus necesidades son relativamente simples (solo distribuye una aplicación e instala algunos artefactos), existen muchas otras buenas opciones, incluidas las gratuitas (como izPack o el ya mencionado Lauch4j ). Pero usted preguntó por la mejor manera, y hasta donde yo sé, install4j es la única, especialmente para distribuir aplicaciones Java (EE) más grandes o más complicadas.

Jonik
fuente
¿Sabe cómo obligarlo a ejecutar JVM 5.0 en Mac OS? Con Windows, simplemente empaqueta el JRE, pero en Mac es posible que tengan otra JVM predeterminada configurada. Entonces no estoy seguro de cómo forzarlo explícitamente a usar la versión específica de JVM que desea ...
Stephane Grenier
@Stephane, en realidad no he creado instaladores de OS X con install4j, pero creo que no debería ser un problema dadas las opciones flexibles de agrupación / detección de JRE que tiene. Para obtener más información sobre ellos, consulte los enlaces en esta respuesta: stackoverflow.com/questions/995881/…
Jonik
Dado que Mac admite la creación de paquetes de aplicaciones Java, puede especificar el JRE en el info.plist así ... <key> JVMVersion </key> <string> 1.5+ </string> Puede eliminar el plus para requerir una versión específica . Así es como lo hago pero no uso install4j. Hay un montón de páginas que explican la creación de aplicaciones para Mac en la web. También, recomiendo simplemente mirar cómo lo hacen limewire o vuze (aplicaciones java). ¡También puede ver los scripts de compilación que utilizan para compilar los paquetes de aplicaciones y los archivos dmg, ya que son de código abierto!
Cal
0

La mejor respuesta depende de la plataforma. Para la implementación en Windows, he obtenido buenos resultados con una combinación de one-jar y launch4j . Me tomó un poco de tiempo configurar correctamente mi entorno de compilación (scripts de hormigas, en su mayoría) pero ahora es bastante sencillo.

clasificatorio
fuente
0

Bueno, desde mi punto de vista, el mecanismo de distribución superior es usar algo como ClickOnce o WebStart tecnología . Simplemente implementa la versión en el servidor y llega automáticamente a los clientes cuando se lanza la versión. Además, la plataforma Eclipse RCP contiene UpdateManager que hace lo que hace WebStart, pero también mucho más.

Dado que estoy usando Maven2 para la construcción, la implementación es muy sencilla: copie el jar construido en la ubicación en el servidor, actualice el archivo jnlp si es necesario y listo.

Petr Macek
fuente
0

installanywhere es bueno pero caro - no he encontrado (tan) bueno gratis

Tom
fuente
Vea esto para las alternativas de InstallAnywhere, incluidas algunas gratuitas (así como las comerciales que tienen un precio mucho más razonable): stackoverflow.com/questions/759855/…
Jonik
-2

Comprimiría el archivo jar junto con otros archivos jar dependientes, archivos de configuración y documentación junto con run.bat / run.sh. El usuario final debería poder descomprimirlo en cualquier ubicación y editar run.bat si es necesario (debería ejecutarse sin editar en la mayoría de los casos). Un instalador puede ser útil si desea crear entradas en el menú de inicio, escritorio, bandeja del sistema, etc.

Como usuario, prefiero descomprimir y ejecutar el tipo de instalación (sin entradas del menú de inicio, por favor). Sin embargo, las personas ajenas a la industria de las tecnologías de la información pueden tener preferencias diferentes. Por lo tanto, si la aplicación está destinada principalmente a desarrolladores, la ruta zip-run.bat y las aplicaciones para el público en general se pueden instalar mediante un instalador.

Rejeev Divakaran
fuente
Esto nunca funcionará para los novatos.
rhody