我想知道如何将运行时参数发送到通过JNLP文件启动的JavaFX应用程序。
JNLP文件摘要:
<jfx:javafx-desc width="800" height="600" main-class="com.blah.Main" name="Main" >
<argument>blah1</argument>
<argument>blah2</argument>
</javafx-desc>
此代码段将检索args:
List<String> list = this.getParameters().getRaw();
for (String s : list) {
System.err.println("args : " + s);
}
如果应用程序启动为:
javaws http://localhost:8080/test/Main.jnlp
javaws Main.jnlp
找到并打印参数,所以这很好。我真的希望能够在启动应用程序时修改params。
根据javaws规范http://docs.oracle.com/javase/7/docs/technotes/tools/share/javaws.html 我应该可以做到:
javaws -open newblah http://localhost:8080/test/Main.jnlp
javaws -open newblah Main.jnlp
这不起作用。显示的争论仍然来自JNLP文件。
我还尝试了“-J”选项为VM提供选项:
javaws -J-Dblah=something http://localhost:8080/test/Main.jnlp
javaws -J-Dblah=something Main.jnlp
并使用以下代码检索参数:
System.getProperty("blah", "noblah");
这适用于“javaws -J-Dblah =某些Main.jnlp”,但不适用于通过URL运行。我猜这是一个安全的问题。我的JNLP已经
了<security>
<all-permissions/>
</security>
我已使用使用此命令创建的自签名密钥对应用程序进行了签名:
keytool -genkey -keyalg RSA -alias selfsigned -keystore selfsigned.jks -storepass XXXXXXX -validity 3600 -keysize 2048
最后,我尝试发送查询参数,例如:
javaws http://localhost:8080/test/Main.jnlp?blah=something
并使用以下代码检索它们:
public static Map<String, String> parseQueryParameters() {
Map<String, String> params = new HashMap<>();
String url = app.getHostServices().getDocumentBase().toString();
System.err.println("url = " + url);
if (url.indexOf("?") > -1) {
String parameters = url.substring(url.indexOf("?") + 1);
StringTokenizer paramGroup = new StringTokenizer(parameters, "&");
while (paramGroup.hasMoreTokens()) {
try {
StringTokenizer value = new StringTokenizer(paramGroup.nextToken(), "=");
params.put(value.nextToken(), URLDecoder.decode(value.nextToken(), "UTF-8"));
} catch (UnsupportedEncodingException ex) {
System.err.println("error");
}
}
}
return params;
}
但是url字符串的打印行只返回:
url=http://localhost:8080/test/
我真的很想知道为什么我不能得到一些应该直接工作的东西。