在WebStart应用程序中,我使用此代码以编程方式检索JNLP代码库:
package web.start.test;
import java.net.URL;
import javax.jnlp.BasicService;
import javax.jnlp.ServiceManager;
import javax.jnlp.UnavailableServiceException;
import javax.swing.JOptionPane;
public class WebStartTest
{
public static void main(String[] args)
{
try
{
BasicService basicService = (BasicService) ServiceManager.lookup("javax.jnlp.BasicService");
URL codeBase = basicService.getCodeBase();
JOptionPane.showMessageDialog(null, "Code base is: [" + codeBase + "]");
}
catch (UnavailableServiceException exception)
{
throw new RuntimeException(exception);
}
}
}
我正在使用此JNLP描述符来启动应用程序:
<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="1.0+" codebase="file:/d:/playground/eclipse/WebStartTest" href="WebStartTest.jnlp">
<information>
<title>WebStartTest</title>
<vendor>Web Start Tester</vendor>
</information>
<security>
<all-permissions/>
</security>
<resources>
<j2se version="1.7+" />
<jar href="target/WebStartTest-0.0.1-SNAPSHOT.jar" />
</resources>
<application-desc main-class="web.start.test.WebStartTest" />
</jnlp>
打包并签署jar文件后,点击JNLP文件上的Enter键会成功启动应用程序,但弹出消息显示:“代码库为:[null]”。
相同的代码在部署到Web服务器时正确检索代码库,并通过使用“http://”而不是“file://”作为代码库协议的JNLP文件启动。
有没有办法在使用带有“file://”代码库的JNLP描述符部署在本地(或共享网络)驱动器上时检索WebStart应用程序的代码库?
如果没有,我怎样才能以编程方式找到应用程序目录的URL以访问资源文件(未包装在jar文件中)?
此外,从最佳实践的角度来看:将WebStart应用程序部署在共享网络驱动器而不是Web服务器中(为简单起见)是一种合理的方法,还是应该避免的hack?< / p>
谢谢。
答案 0 :(得分:1)
您可以尝试从已知类的URL派生应用程序代码库。
URL url = WebStartTest.class.getResource("/web/start/test/WebStartTest.class");
System.out.println("url = " + url);
打印
url = file:C:/projects/Test/classes/web/start/test/WebStartTest.class
答案 1 :(得分:1)
遗憾的是,正如Java {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{ :
本地Applet为代码库返回NULL
从JDK 7u25开始,applet的getCodeBase()方法将会 当applet从本地文件系统运行时返回NULL。
不幸的是,Release Notes尚未更新以反映这一点。
是的,使用共享驱动的Web Start会让你进入一个痛苦的世界,我建议你不要沿着那条路走下去,因为你会对这种突然的行为变化感到好玩一,以及缓存问题和什么不是。对于普通的Web Start应用程序来说,这已经很痛苦了,但是当你向黑暗角落推进他们几乎没有在内部测试时,我会害怕遇到越来越多的问题。并不是说我特别不喜欢Web Start,但在过去的两年中,许多更新引入了非常时髦的错误。
答案 2 :(得分:-1)
可能是因为您使用'file:/'而不是'file://'?