我想知道如何将运行时参数发送到通过 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
找到并打印了参数,所以这很好。我真的希望能够在应用程序启动时修改参数。
根据 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=something 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/
我真的很想知道为什么我不能得到应该直接工作的东西。