Java Web Start не передает аргументы приложению при работе в браузере

У меня проблемы с передачей аргументов в приложение Java, запущенное с помощью Java Web Start. Моя система Ubuntu Linux 12.04.1 Precise, но то же самое происходит и в Windows 7. Оба используют Oracle Java версии 1.7.0_09.

Изменить: я исследую, если приложение Web Start будет отвечать нашим потребностям лучше, чем обычный апплет. Проблема с апплетом в том, что он закрывается, если пользователь уходит со страницы, а это не то, что нам нужно. (Нам также интересно узнать, сможем ли мы обойти определенную проблему безопасности, используя Web Start вместо апплета.) Мы хотели бы запустить приложение из браузера, чтобы мы могли передавать информацию об аутентифицированном пользователе Java-приложение. Требование пользователя войти в приложение кажется плохим решением (возможно, нам придется поддерживать такие вещи, как OAuth).

У меня есть пример программы CommandLineArgs.java:

public class CommandLineArgs {
    public static void main(String[] args)  {
        System.out.println(String.format("Got %d command line args:", args.length));
        for (String arg : args) {
            System.out.println(arg);
        }
    }
}

Я упаковал это в банку:

javac CommandLineArgs.java
zip cmd.jar CommandLineArgs.class

Затем у меня есть файл JNLP с именем cmd.jnlp:

<?xml version="1.0" encoding="utf-8"?>

<!-- Empty codebase means use same directory. -->
<jnlp spec="1.0+" codebase="https://localhost:9876/">
    <information>
        <title>Command Line Args Printer</title>
        <vendor>No one</vendor>
        <homepage href="https://localhost:9876/"/>
        <description>Application that prints the command line arguments that it gets.</description>
    </information>
    <resources>
        <j2se version="1.6+" initial-heap-size="32m" max-heap-size="128m" />
        <property name="jnlp.versionEnabled" value="true"/>

        <jar href="cmd.jar" main="true"/>

    </resources>
    <application-desc main-class="CommandLineArgs">
        <!-- Here are sample arguments I'd like to pass to the program. -->
        <argument>arg1</argument>
        <argument>arg2</argument>
        <argument>arg3</argument>
    </application-desc>
</jnlp>

Вот HTML-страница cmd.html, которую я использую для тестирования. Элемент div изначально был создан с помощью deployjava.js: deployJava.launchWebStartApplication('https://localhost:9876/cmd.jnlp')

<!DOCTYPE html>

<html>
<head>
    <title>Java web start command line arguments test</title>

    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
</head>
<body>

<div id="div1" style="position: relative; left: -10000px; margin: 0px auto; " class="dynamicDiv">
    <embed type="application/x-java-applet;jpi-version=1.7.0_09" width="0" height="0" launchjnlp="https://localhost:9876/cmd.jnlp" docbase="https://localhost:9876/">
</div>

</body>
</html>

Самый быстрый способ, которым я мог запустить сервер https, - это использовать инструмент openssl, обычно встречающийся в Linux. При запуске сервера, подобного этому, текущий каталог должен содержать cmd.html, cmd.jar и cmd.jnlp.

sudo cp /etc/ssl/private/ssl-cert-snakeoil.key .
sudo chmod 666 ssl-cert-snakeoil.key
openssl req -batch -new -x509 -key ssl-cert-snakeoil.key -out ssl-cert-snakeoil.key.crt
openssl s_server -cert ssl-cert-snakeoil.key.crt -key ssl-cert-snakeoil.key -accept 9876 -WWW

Теперь, если я зайду https://localhost:9876/cmd.html Я могу запустить приложение. Консоль Java открывается и печатает это. Обратите внимание, что есть 0 аргументов командной строки.

   JNLP Ref (absolute): https://localhost:9876/cmd.jnlp
    Match: beginTraversal
Match: digest selected JREDesc: JREDesc[version 1.6+, heap=33554432-134217728, args=null, href=null, sel=false, null, null], JREInfo: JREInfo for index 0:
    platform is: 1.7
    product is: 1.7.0_09
    location is: http://java.sun.com/products/autodl/j2se
    path is: /opt/jre1.7.0_09/bin/java
    args is: -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8001
    native platform is: Linux, amd64 [ x86_64, 64bit ]
    JavaFX runtime is: JavaFX 2.2.3 found at /opt/jre1.7.0_09/
    enabled is: true
    registered is: true
    system is: true

    Match: ignoring maxHeap: 134217728
    Match: selecting InitHeap: 33554432
    Match: digesting vmargs: null
    Match: digested vmargs: [JVMParameters: isSecure: true, args: ]
    Match: JVM args after accumulation: [JVMParameters: isSecure: true, args: ]
    Match: digest LaunchDesc: null
    Match: digest properties: []
    Match: JVM args: [JVMParameters: isSecure: true, args: ]
    Match: endTraversal ..
    Match: JVM args final: -Xms32m
    Match: Running JREInfo Version    match: 1.7.0.09 == 1.7.0.09
     Match: Running JVM args match: have:<-Xms32m     satisfy want:<-Xms32m>
Got 0 command line args:

С другой стороны, если я запускаю челюсти из командной строки (javaws cmd.jnlp), Я получаю это в консоли Java. Теперь есть 3 аргумента командной строки.

    Match: beginTraversal
Match: digest selected JREDesc: JREDesc[version 1.6+, heap=33554432-134217728, args=null, href=null, sel=false, null, null], JREInfo: JREInfo for index 0:
    platform is: 1.7
    product is: 1.7.0_09
    location is: http://java.sun.com/products/autodl/j2se
    path is: /opt/jre1.7.0_09/bin/java
    args is: -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8001
    native platform is: Linux, amd64 [ x86_64, 64bit ]
    JavaFX runtime is: JavaFX 2.2.3 found at /opt/jre1.7.0_09/
    enabled is: true
    registered is: true
    system is: true

    Match: ignoring maxHeap: 134217728
    Match: selecting InitHeap: 33554432
    Match: digesting vmargs: null
    Match: digested vmargs: [JVMParameters: isSecure: true, args: ]
    Match: JVM args after accumulation: [JVMParameters: isSecure: true, args: ]
    Match: digest LaunchDesc: null
    Match: digest properties: []
    Match: JVM args: [JVMParameters: isSecure: true, args: ]
    Match: endTraversal ..
    Match: JVM args final: -Xms32m
    Match: Running JREInfo Version    match: 1.7.0.09 == 1.7.0.09
     Match: Running JVM args match: have:<-Djnlp.versionEnabled=true -Xms32m     satisfy want:<-Xms32m>
Got 3 command line args:
arg1
arg2
arg3

Я делаю что-то неправильно? Почему аргументы не передаются моей программе при работе в браузере?

Я обнаружил, что пост- приложение Java WS время от времени игнорирует аргументы, которые описывают ту же проблему. Решением для posdef было удаление атрибута href из элемента jnlp в файле jnlp, но у меня нет этого атрибута.

3 ответа

application-desc для приложений WebStart, используйте applet-desc для апплетов.

Нам также интересно узнать, сможем ли мы обойти определенную проблему безопасности, используя Web Start вместо апплета.

Среда безопасности применяется к приложениям на основе JWS. всегда был очень похож на то, что применяется к апплетам. Некоторые незначительные различия были в том, что System.exit(n) всегда был ограничен в апплетах (даже доверенных) и в том, что JWS предлагал промежуточный уровень безопасности между "песочницей" и "доверенными".

Sun приложила огромные усилия для интеграции двух форм плагина, прежде чем Oracle купит их.

Итак, короткий ответ на этот вопрос: "Нет". Если вы можете сделать это в приложении JWS, вы сможете сделать это в апплете.

Согласно документации Oracle

"Элемент property определяет системное свойство, которое будет доступно через методы System.getProperty и System.setProperties. Он имеет два обязательных атрибута: имя и значение."

Затем приведен этот пример:

<property name="key" value="overwritten"/> 

Чтобы получить значение внутри класса Java:

System.getProperty("key");

Другие вопросы по тегам