java - que - ¿Cuál es la mejor forma de detectar si Webstart inicia una aplicación?
java web start executable ibm (5)
Como mencionó, verificar la propiedad del sistema de la siguiente manera es probablemente la forma más limpia:
private boolean isRunningJavaWebStart() {
return System.getProperty("javawebstart.version", null) != null;
}
En un sistema de producción, he usado la técnica anterior durante años.
También puede intentar verificar si hay propiedades que comiencen con "jnlpx". pero ninguno de ellos está realmente "garantizado" para estar allí, por lo que yo sé.
Una alternativa podría ser intentar crear una instancia del DownloadService sugerido por Tom:
private boolean isRunningJavaWebStart() {
try {
DownloadService ds = (DownloadService) ServiceManager.lookup("javax.jnlp.DownloadService");
return ds != null;
} catch (UnavailableServiceException e) {
return false;
}
}
Por supuesto, eso tiene el inconveniente de acoplar su código a esa API.
Como quedó claro en mi reciente pregunta , las aplicaciones Swing necesitan llamar explícitamente a System.exit () cuando se ejecutan utilizando el iniciador Sun Webstart (al menos desde Java SE 6).
Quiero restringir este truco tanto como sea posible y estoy buscando una manera confiable de detectar si la aplicación se está ejecutando bajo Webstart. En este momento estoy comprobando que el valor de la propiedad del sistema "webstart.version" no es nulo, pero no pude encontrar ninguna garantía en la documentación de que esta propiedad se establezca en futuras versiones / implementaciones alternativas.
¿Hay alguna forma mejor (preferiblemente las que no establecen una dependencia en la API de webstart?)
No tengo una experiencia real con Java web start, aparte de verlo hace unos años.
¿Qué tal si inicia su aplicación con un parámetro que defina antes de configurarlo a través de Java web start?
Si desea pasar argumentos a su aplicación, debe agregarlos al archivo de inicio (también conocido como descriptor JNLP) usando o elementos.
Luego verifique si estas propiedades están configuradas.
De nuevo, esta es una sugerencia que no he codificado para JWS y puede que no sea tan fácil.
Use el javax.jnlp.ServiceManager para recuperar un servicio webstart. Si está disponible, se está ejecutando bajo Webstart.
Ver http://download.java.net/jdk7/docs/jre/api/javaws/jnlp/index.html
Cuando el código se inicia a través de javaws, se carga javaws.jar y están disponibles las clases de la API JNLP de las que no desea depender. En lugar de probar una propiedad del sistema que no está garantizada, podría ver si existe una clase de API JNLP:
private boolean isRunningJavaWebStart() {
boolean hasJNLP = false;
try {
Class.forName("javax.jnlp.ServiceManager");
hasJNLP = true;
} catch (ClassNotFoundException ex) {
hasJNLP = false;
}
return hasJNLP;
}
Esto también evita la necesidad de incluir javaws.jar en su ruta de clase al compilar.
Alternativamente, puede cambiar a compilar con javaws.jar y capturar NoClassDefFoundError en su lugar:
private boolean isRunningJavaWebStart() {
try {
ServiceManager.getServiceNames();
return ds != null;
} catch (NoClassDefFoundError e) {
return false;
}
}
Usar ServiceManager.lookup (String) y UnavailableServiceException es un problema porque ambos son parte de la API de JNLP. El ServiceManager.getServiceNames () no está documentado para tirar. Estamos llamando específicamente a este código para buscar NoClassDefFoundError.
Puede verificar si el cargador de clases actual es una instancia de com.sun.jnlp.JNLPClassLoader (complemento de Java 1) o sun.plugin2.applet.JNLP2ClassLoader (complemento de Java 2). A pesar del paquete "applet", un applet que usa JNLP con el plugin Java 2 usa otro cargador de clases, sun.plugin2.applet.Applet2ClassLoader. Funciona con OpenJDK también.