Pregunta

Estoy escribiendo una aplicación en Java para escritorio usando la biblioteca Eclipse SWT para renderizado GUI.Creo que SWT ayuda a Java a superar el mayor obstáculo para la aceptación en el escritorio:es decir, proporcionar una aplicación Java con una interfaz consistente y receptiva que se parece a la de cualquier otra aplicación en su escritorio.Sin embargo, creo que empaquetar una aplicación sigue siendo un problema.

OS X proporciona de forma nativa un mecanismo sencillo para empaquetar aplicaciones Java en paquetes de aplicaciones nativas, pero producir una aplicación para Windows/Linux que no requiera que el usuario ejecute un feo archivo por lotes o haga clic en un .jar sigue siendo una molestia.Posiblemente eso no sea un problema en Linux, donde es probable que el usuario sea un poco más experto en tecnología, pero en Windows me gustaría tener un .exe normal para que lo ejecute.

¿Alguien ha tenido alguna experiencia con alguna de las herramientas de generación de .exe para Java que existen?Probé JSmooth pero tuve varios problemas.¿Existe una solución mejor antes de descifrar Visual Studio y lanzar la mía propia?

Editar: Quizás debería mencionar que no puedo gastar mucho dinero en una solución comercial.

¿Fue útil?

Solución

Para dar seguimiento a la respuesta de pauxu, estoy usando launch4j y NSIS en un proyecto mío y pensé que sería útil mostrar cómo los estoy usando.Esto es lo que estoy haciendo para Windows.Por cierto, estoy creando .app y .dmg para Mac, pero todavía no he descubierto qué hacer para Linux.

Copias del proyecto de launch4j y NSIS

En mi proyecto tengo un directorio de "proveedor" y debajo tengo un directorio para "launch4j" y "nsis".Dentro de cada uno hay una copia de la instalación de cada aplicación.Me resulta más fácil tener una copia local del proyecto en lugar de obligar a otros a instalar ambos productos y configurar algún tipo de variable de entorno para apuntar a cada uno.

Archivos de secuencia de comandos

También tengo un directorio de "scripts" en mi proyecto que contiene varios archivos de configuración/scripts para mi proyecto.Primero está el archivo launch4j.xml:

<launch4jConfig>
  <dontWrapJar>true</dontWrapJar>
  <headerType>gui</headerType>
  <jar>rpgam.jar</jar>
  <outfile>rpgam.exe</outfile>
  <errTitle></errTitle>
  <cmdLine></cmdLine>
  <chdir>.</chdir>
  <priority>normal</priority>
  <downloadUrl>http://www.rpgaudiomixer.com/</downloadUrl>
  <supportUrl></supportUrl>
  <customProcName>false</customProcName>
  <stayAlive>false</stayAlive>
  <manifest></manifest>
  <icon></icon>
  <jre>
    <path></path>
    <minVersion>1.5.0</minVersion>
    <maxVersion></maxVersion>
    <jdkPreference>preferJre</jdkPreference>
  </jre>
  <splash>
    <file>..\images\splash.bmp</file>
    <waitForWindow>true</waitForWindow>
    <timeout>60</timeout>
    <timeoutErr>true</timeoutErr>
  </splash>
</launch4jConfig>

Y luego está el script NSIS rpgam-setup.nsis.Puede ser necesario un argumento VERSIÓN para ayudar a nombrar el archivo.

; The name of the installer
Name "RPG Audio Mixer"

!ifndef VERSION
    !define VERSION A.B.C
!endif

; The file to write
outfile "..\dist\installers\windows\rpgam-${VERSION}.exe"

; The default installation directory
InstallDir "$PROGRAMFILES\RPG Audio Mixer"

; Registry key to check for directory (so if you install again, it will 
; overwrite the old one automatically)
InstallDirRegKey HKLM "Software\RPG_Audio_Mixer" "Install_Dir"

# create a default section.
section "RPG Audio Mixer"

    SectionIn RO

    ; Set output path to the installation directory.
    SetOutPath $INSTDIR
    File /r "..\dist\layout\windows\"

    ; Write the installation path into the registry
    WriteRegStr HKLM SOFTWARE\RPG_Audio_Mixer "Install_Dir" "$INSTDIR"

    ; Write the uninstall keys for Windows
    WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\RPGAudioMixer" "DisplayName" "RPG Audio Mixer"
    WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\RPGAudioMixer" "UninstallString" '"$INSTDIR\uninstall.exe"'
    WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\RPGAudioMixer" "NoModify" 1
    WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\RPGAudioMixer" "NoRepair" 1
    WriteUninstaller "uninstall.exe"

    ; read the value from the registry into the $0 register
    ;readRegStr $0 HKLM "SOFTWARE\JavaSoft\Java Runtime Environment" CurrentVersion

    ; print the results in a popup message box
    ;messageBox MB_OK "version: $0"

sectionEnd

Section "Start Menu Shortcuts"
  CreateDirectory "$SMPROGRAMS\RPG Audio Mixer"
  CreateShortCut "$SMPROGRAMS\RPG Audio Mixer\Uninstall.lnk" "$INSTDIR\uninstall.exe" "" "$INSTDIR\uninstall.exe" 0
  CreateShortCut "$SMPROGRAMS\RPG AUdio Mixer\RPG Audio Mixer.lnk" "$INSTDIR\rpgam.exe" "" "$INSTDIR\rpgam.exe" 0
SectionEnd

Section "Uninstall"

    ; Remove registry keys
    DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\RPGAudioMixer"
    DeleteRegKey HKLM SOFTWARE\RPG_Audio_Mixer

    ; Remove files and uninstaller
    Delete $INSTDIR\rpgam.exe
    Delete $INSTDIR\uninstall.exe

    ; Remove shortcuts, if any
    Delete "$SMPROGRAMS\RPG Audio Mixer\*.*"

    ; Remove directories used
    RMDir "$SMPROGRAMS\RPG Audio Mixer"
    RMDir "$INSTDIR"

SectionEnd

Integración de hormigas

Tengo algunos objetivos en mi archivo de compilación Ant (build.xml) para manejar lo anterior.Primero le digo a Ant que importe las tareas Ant de launch4j:

<property name="launch4j.dir" location="vendor/launch4j" />
<taskdef name="launch4j" 
    classname="net.sf.launch4j.ant.Launch4jTask"
    classpath="${launch4j.dir}/launch4j.jar:${launch4j.dir}/lib/xstream.jar" />

Entonces tengo un objetivo simple para crear el ejecutable contenedor:

<target name="executable-windows" depends="jar" description="Create Windows executable (EXE)">
    <launch4j configFile="scripts/launch4j.xml" outfile="${exeFile}" />
</target>

Y otro objetivo para crear el instalador:

<target name="installer-windows" depends="executable-windows" description="Create the installer for Windows (EXE)">
    <!-- Lay out files needed for building the installer -->
    <mkdir dir="${windowsLayoutDirectory}" />
    <copy file="${jarFile}" todir="${windowsLayoutDirectory}" />
    <copy todir="${windowsLayoutDirectory}/lib">
        <fileset dir="${libraryDirectory}" />
        <fileset dir="${windowsLibraryDirectory}" />
    </copy>
    <copy todir="${windowsLayoutDirectory}/icons">
         <fileset dir="${iconsDirectory}" />
    </copy>
    <copy todir="${windowsLayoutDirectory}" file="${exeFile}" />

    <mkdir dir="${windowsInstallerDirectory}" />

    <!-- Build the installer using NSIS -->
    <exec executable="vendor/nsis/makensis.exe">
        <arg value="/DVERSION=${version}" />
        <arg value="scripts/rpgam-setup.nsi" />
    </exec>
</target>

La parte superior simplemente copia los archivos necesarios para el instalador en una ubicación temporal y la segunda mitad ejecuta el script que los utiliza todos para crear el instalador.

Otros consejos

En mi empresa usamos Lanzamiento4J para crear el archivo exe, y NSIS para crear el instalador, con aplicaciones SWT.

Lo hemos usado durante años en varias aplicaciones comerciales y el par funciona bien.

Tal vez deberías echarle un vistazo IzPack.Creé un instalador muy bueno hace algunos años y apuesto a que todavía lo están mejorando.Permite la instalación de documentos, binarios y un enlace en el que se puede hacer clic para iniciar la aplicación. IIRC.

He usado el gratis Lanzamiento4J para crear un iniciador personalizado para mis programas Java en Windows.Combinado con el gratuito Instalador NSIS puede crear un buen paquete para sus usuarios de Windows.

Editar: No vi que usas SWT.No sé si también funciona con SWT, porque solo usé Swing en mis aplicaciones.

¿Ha considerado escribir un pequeño programa en C/C++ que simplemente llame CreateProcess ¿Iniciar la máquina virtual Java con el archivo jar (o clase)?

podrías conseguir Visual C++ expreso y armar el programa de inicio con bastante facilidad.Esto también facilitaría la adición de un ícono amigable.

Considere convertir su aplicación a eclipse RCP.esta escrito en SWT, y Eclipse IDE contiene herramientas de empaquetado que generan ejecutables para todas las plataformas principales.Para Windows, puede generar un zip o una carpeta que contenga su código.Para una experiencia de instalación común, usaría NSIS.En realidad hay un generador de paquetes proyecto en eclipse para crear instaladores comunes para todas las plataformas que admite eclipse.

Lo has pensado Inicio web de Java? Aquí es un tutorial específico para implementar una aplicación SWT con Java Web Start.

Instalar4J.No es gratis, pero vale la pena.Dale una oportunidad a la prueba

¡Ahora puedes hacer esto a través de Netbeans!Es realmente fácil y funciona perfectamente.Verificar este tutorial en el sitio web de Netbeans.

Pasé por lo mismo y descubrí que todas las opciones gratuitas no eran muy buenas.Parece que escribirás el tuyo propio.Me interesaría ver si alguien tiene una opción gratuita/barata que funcione.

Otra opción que estaba considerando:En lugar de escribir un iniciador nativo desde cero, Eclipse viene con el código fuente de su propio iniciador, y esto quizás podría reutilizarse para mi aplicación.

Es una pena que Sun nunca haya incluido nada similar en el JDK.

Otro voto para Launch4J, acabo de escribir una tarea hormiga esta mañana para integrarla con uno de mis proyectos.Parece funcionar muy bien

He usado JSmooth en el pasado y todavía tengo suerte con él.La interfaz de usuario tiene bastantes errores, pero solo la uso para crear el archivo de configuración una vez, y luego lo compilo desde Ant.

¿Qué problemas tienes con JSmooth?

JSMooth ha funcionado muy bien para nosotros en un entorno de producción, donde primero generé un solo frasco usando one-jar (complemento fat jar para eclipsar) y luego lo envolví con JSmooth.

(Tenga en cuenta que quería una distribución sin instalación de un solo archivo, lo que podría solicitar la instalación del JRE si fuera necesario).

Ha funcionado tan bien que pensé que nadie lo estaba usando :)

Quizás quieras probar nuestra herramienta, Constructor de instalación de BitRock.Aunque es una aplicación nativa, muchos de nuestros clientes la utilizan para empaquetar aplicaciones Java de escritorio.Si incluye el JRE y crea un iniciador, etc.el usuario ni siquiera necesita saber que está instalando una aplicación Java.Es multiplataforma, por lo que puedes generar instaladores tanto para Windows como para Mac (y Linux, Solaris, etc.). Al igual que la herramienta install4j mencionada en otra publicación, es una herramienta comercial. pero contamos con licencias gratuitas para proyectos de código abierto y descuentos especiales para microISV/pequeñas empresas, etc.simplemente envíenos un correo electrónico.También quería enfatizar que esta es una herramienta de instalación, por lo que no satisfará sus necesidades si solo busca un único archivo ejecutable.

En mi empresa utilizamos launch4J y NSIS para la distribución de Windows, jdeb para la distribución Debian y Java Web Start para el sistema operativo general.Esto funciona bastante bien.

Por favor, inténtalo InstalarJammer.El mejor que he usado jamás.Gratis y potente. Y suficiente para uso personal y comercial.

¿Has considerado el instalador avanzado?

Lo he usado varias veces, especialmente para Windows y Mac.No se requieren secuencias de comandos ni Ant.Toda la interfaz gráfica de usuario.Muy simple y comprensible.No es gratis pero vale cada centavo.

- Iniciar como administrador
- Asociación de archivos
- Temas de instalación personalizados + Temas integrados
- Paquete con JRE
- Ubicación de instalación
- Implementación de pantalla de bienvenida nativa
- Puedes crear eventos de servicios y eventos de instalación.
- Requisitos previos
- JRE versión mínima y versión máxima

Y mucho más.Y no lo confundas, no tengo conexiones con los chicos... su aplicación es simplemente increíble.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top