Pregunta

Como quedó claro en mi Pregunta reciente , las aplicaciones Swing deben llamar explícitamente a System.exit () cuando se ejecutan con el iniciador de Sun Webstart (al menos a partir de Java SE 6).

Quiero restringir este truco tanto como sea posible y estoy buscando una forma confiable de detectar si la aplicación se está ejecutando bajo Webstart. Ahora mismo 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 debería establecerse en futuras versiones / implementaciones alternativas.

¿Hay formas mejores (preferiblemente unas que no creen una dependencia en la API de inicio web?)

¿Fue útil?

Solución

Cuando su código se inicia a través de javaws, javaws.jar se carga y las clases de API de JNLP de las que no quiere depender están disponibles. En lugar de probar una propiedad del sistema que no se garantiza que exista, 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, puedes 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;
    }
}

El uso de ServiceManager.lookup (String) y UnavailableServiceException es un problema porque ambos son parte de la API de JNLP. El ServiceManager.getServiceNames () no está documentado para lanzar. Llamamos específicamente a este código para verificar si hay un NoClassDefFoundError.

Otros consejos

Utilice el javax.jnlp.ServiceManager para recuperar un servicio de inicio web. Si está disponible, se está ejecutando bajo Webstart.

Consulte http://download.java.net /jdk7/docs/jre/api/javaws/jnlp/index.html

Como mencionaste, 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 puedes intentar verificar si hay propiedades que comiencen con " jnlpx. " pero ninguno de ellos está realmente "garantizado" estar allí tampoco por lo que sé.

Una alternativa podría ser intentar crear una instancia del servicio de descarga 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 la desventaja de acoplar su código a esa API.

No tengo experiencia real con el inicio de la web de Java, aparte de verlo hace unos años.

¿Qué tal si inicias tu aplicación con un parámetro que definas el que configuraste cuando la aplicación se inicia 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 establecidas.

De nuevo, esta es una sugerencia que no he codificado para JWS y puede que no sea tan fácil.

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 " applet " paquete, un applet que usa JNLP con el complemento Java 2 usa otro cargador de clases, sun.plugin2.applet.Applet2ClassLoader. También funciona con OpenJDK.

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