3

在 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 键成功启动应用程序,但弹出消息显示:“Code base is: [null]”

当部署在 Web 服务器中并通过使用“http://”而不是“file://”作为代码库协议的 JNLP 文件启动时,相同的代码会正确检索代码库。

当使用带有“file://”代码库的 JNLP 描述符部署在本地(或共享网络)驱动器上时,有没有办法检索 WebStart 应用程序的代码库?

如果没有,我还能如何以编程方式找到应用程序目录的 URL 以访问资源文件(未打包在 jar 文件中)?

此外,从最佳实践的角度来看:将 WebStart 应用程序部署在共享网络驱动器而不是 Web 服务器中(为了简单起见)是一种合理的方法,还是应该避免的黑客攻击?

谢谢你。

4

3 回答 3

0

因为,遗憾的是,自 Java 7 Update 25 以来就是这样,正如其关于s 的发行说明Applet中所述,这似乎也适用于BasicService

本地小程序为代码库返回 NULL

从 JDK 7u25 开始,当 applet 从本地文件系统运行时,applet 的 getCodeBase() 方法将返回 NULL。

不幸的是,Javadoc尚未更新以反映这一点。

是的,从共享驱动器使用 Web Start 会让你进入一个痛苦的世界,我建议你不要走那条路,因为你会很有趣地对抗像这种突然的行为变化,以及缓存问题和什么不是。这对于普通的 Web Start 应用程序来说已经很痛苦了,但是当你推到他们似乎几乎无法在内部进行体面测试的黑暗角落时,我会害怕遇到越来越多的问题。并不是我特别不喜欢 Web Start,而是在过去的 2 年中,许多更新引入了非常时髦的错误。

于 2013-09-03T20:31:32.717 回答
0

您可以尝试从已知类的 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
于 2013-08-28T04:02:48.217 回答
-1

可能是因为您使用的是 'file:/' 而不是 'file://' 吗?

于 2013-09-03T13:17:19.407 回答