usar - ¿Cuál es la mejor manera de iniciar aplicaciones Java en Windows 7?
verificar java instalado (5)
Requisitos
Quiero publicar una aplicación Java GUI en Windows 7. Esta aplicación está usando Swing Toolkit y no necesita ningún código nativo. La aplicación se instala usando un instalador NSIS . Quiero integrar esta aplicación en Windows 7 lo mejor posible. Esto significa:
- Cuando la aplicación se está ejecutando, debe ser posible fijar la aplicación a la barra de tareas.
- Debe ser posible asociar archivos de datos con la aplicación para que Windows abra estos archivos con mi aplicación.
- Debe funcionar automáticamente con Java Runtime de 32 bits y con el tiempo de ejecución de Java de 64 bits. Entonces, cuando el usuario desinstala un Java de 32 bits y en su lugar instala un Java de 64 bits (o viceversa), entonces mi aplicación aún debe funcionar.
- Debe ser compatible con la configuración de fuentes grandes de Windows. Realmente no entiendo esta característica. Solo sé que algunas aplicaciones lo ignoran por completo, otros (como Google Chrome) tienen una escala de píxel (se ve realmente feo) y otros lo soportan simplemente usando fuentes más grandes según lo previsto (Eso es lo que quiero y normalmente funciona. Solo la solución WinRun4J mencionado a continuación no funciona con él).
Soluciones probadas
WinRun4J
WinRun4j es un archivo EXE que inicia la aplicación Java. Como la aplicación no incluye un nuevo proceso de Java, Windows considera que el archivo EXE es la aplicación. Entonces no hay problema con la barra de tareas. Las asociaciones de archivos funcionan porque los archivos se pueden asociar simplemente con el archivo EXE.
Problemas:
- No es compatible con fuentes grandes. La ventana de la aplicación está escalada en píxeles (como Google Chrome).
- Se deben usar dos archivos EXE diferentes según el JRE instalado. Por lo tanto, cuando se instala el JRE de 64 bits, la aplicación debe iniciarse con el archivo EXE de 64 bits. Cuando se instalan 32 bits JRE, se debe usar el otro EXE. Esto no es fácil de usar porque el usuario no entiende por qué debe usar el EXE de 32 bits en un sistema operativo de 64 bits cuando solo está instalado un JRE de 32 bits.
Launch4J
Launch4J crea un EXE de 32 bits que inicia un proceso Java externo para iniciar la aplicación Java. Entonces, a diferencia de WinRun4J, también puede iniciar un Java de 64 bits.
Problemas:
- No se puede fijar la aplicación a la barra de tareas.
-
System.out.println
no se imprimirá en la consola siheaderType="gui"
, independientemente de si la aplicación se inicia desde la consola.
TARRO
En Windows, simplemente puede hacer doble clic en el archivo JAR para iniciar la aplicación. JRE instalado no importa, simplemente funciona. Pero...
Problemas:
- La aplicación no se puede anclar en la barra de tareas.
- No se puede crear un acceso directo en el menú de inicio.
- No se pueden asociar archivos con un archivo JAR.
BAT / CMD
Un simple archivo por lotes como este se puede utilizar para iniciar la aplicación:
@echo off
start c:/windows/system32/javaw.exe -jar "c:/program files/myapp/myapp.jar" %1
Se puede crear un acceso directo para que este archivo por lotes establezca un icono personalizado.
Problemas:
- Una ventana de DOS aparece cuando se inicia la aplicación.
- El archivo por lotes no sabe dónde se encuentra javaw.exe. Dependiendo de la versión java (32 o 64 bit) que esté instalada, puede ubicarse en
c:/windows/syswow64
y Windows no redirigirá esta llamada desde los archivos por lotes automáticamente. El uso de la variable de entornoJAVA_HOME
también es un no-go porque Java no establece esto automáticamente. - Al asociar archivos con el archivo por lotes, no se puede configurar ningún icono personalizado.
- La compatibilidad con la barra de tareas no funciona correctamente. La aplicación se puede anclar cuando el archivo de proceso por lotes se inicia manualmente, pero al hacer doble clic en un archivo asociado, no funciona.
Atajo
En lugar de utilizar un archivo por lotes, solo es posible crear un acceso directo para iniciar la aplicación. Se vincula a este comando: c:/windows/system32/javaw.exe -jar "c:/program files/myapp/myapp.jar"
. Windows redirige automáticamente esta llamada al directorio SysWOW64 si está instalado un Java JRE de 32 bits.
Problemas:
- No es posible asociar archivos con él porque Windows solo acepta archivos EXE / COM / PIF / BAT / CMD como destinos de asociación. Los archivos LNK no funcionan.
Pregunta
¿Hay alguna otra solución que cumpla con todos los requisitos de arriba? ¿O hay algún truco para resolver los problemas con las soluciones mencionadas?
Solución
Después de resolver el problema de fijación de la barra de tareas utilizando Launch4J parece la mejor solución. Launch4j puede integrarse fácilmente en un proyecto de Maven (con this o this complemento), la configuración es bastante fácil y todo funciona de la caja, excepto la fijación de la barra de tareas. Para la fijación de barras de tareas, la aplicación Java debe establecer un appModelUserId como se explica en la respuesta a esta pregunta .
Además, la aplicación Java debe ser instalada por un instalador que debe al menos instalar un atajo que apunte al EXE. Este acceso directo también debe contener el appModelUserId. Con NSIS, esto se puede hacer con el complemento WinShell y una configuración como esta:
CreateShortCut "$SMPROGRAMS/MyApp.lnk" /
"$INSTDIR/myapp.exe" "" "$INSTDIR/myapp.exe" 0 SW_SHOWNORMAL
WinShell::SetLnkAUMI "$SMPrograms/MyApp.lnk" "MyAppModelUserId"
Por alguna razón desconocida, este atajo solo tiene que existir. No tienes que usarlo. Puede hacer doble clic en el EXE y la barra de tareas sigue funcionando. Incluso puede crear el acceso directo en alguna subcarpeta de su carpeta de aplicaciones. La barra de tareas de fijación deja de funcionar cuando se elimina el último acceso directo del archivo EXE.
Como un aparte, también mira la nueva característica para tener tu aplicación en la bandeja de herramientas / systemtray:
Oracle tiene un http://java.sun.com/developer/technicalArticles/J2SE/Desktop/javase6/systemtray/ sobre cómo usar la bandeja del sistema.
Eso es relacionado con Java SE 6 .... ¿también me hace bobiner qué otras cosas podrían estar en el nuevo Java 7?
He tenido un buen éxito con WinRun4J en general, pero realmente no he hecho mucho con las fuentes, así que confesaré que no estoy seguro de entender por qué estás teniendo el problema que describes allí.
Sin embargo, de lo que describes, parece que tienes requisitos muy específicos de un iniciador nativo de Java. ¿Por qué no solo escribes el tuyo? Podría comenzar con algo como WinRun4J (que es de código abierto, con licencia de Eclipse CPL) y simplemente modificarlo según sus necesidades.
Alternativamente, puede buscar en los lanzadores nativos utilizados por otros programas. Los lanzadores Eclipse y NetBeans parecen funcionar bastante bien, y ambos son de código abierto. Es posible que también puedas adaptar uno de ellos con bastante facilidad.
Java Web Start : en estos días, no consideraría distribuir una aplicación de otra manera.
El usuario necesita tener al menos J2SE 1.4; si sus aplicaciones necesitan una versión posterior, Web Start descargará automáticamente un JRE apropiado.
Consulte la referencia de JNLP para las etiquetas de integración de escritorio ( shortcut
y offline-allowed
) y asociaciones de archivos ( association
). Sin embargo, estos solo son compatibles con WS 1.5.
Personalmente uso Launch4j (a través de maven con el maven-launch4j-plugin para ser aún más preciso), e implemento la administración de la bandeja del sistema desde mi aplicación ... (Ver http://java.sun.com/developer/technicalArticles/J2SE/Desktop/javase6/systemtray/ ).
Pruebe Launch4j ( Launch4J ), es un contenedor sencillo para exe (en realidad, el ajuste del contenedor es opcional). Debería resolver sus requisitos de Icon y Taskbar. También es capaz de ubicar los JRE instalados (algunas reglas configurables). El problema con la fuente que aún no entendí, Swing debería usar automáticamente las fuentes dependiendo de la configuración de Windows, a menos que de algún modo sobrescriba eso en las opciones de JRE o en el código.