本地替代JNLP文件的方法?

10
尝试了很多次,我仍然无法通过双击来在本地运行JNLP文件。似乎是定位jar文件的问题,即使我将其相对于jnlp文件进行了指定,还是会出现以下错误消息:

The field <jar>href has an invalid value: helloworld.jar

即使JNLP文件与helloworld.jar在同一个文件夹中,这种情况仍会发生。我已经搜索过,这是一个一致性问题,特别是对于想要在CD上打包应用程序并使用JNLP的人而言。唯一提供的Sun公司的“解决”方法是通过命令行指定代码库,但这并没有真正帮到我。我不明白为什么他们不假定或允许代码库为“.”或“file://.” - 我尝试在文件内的jnlp标签(参数为codebase)中使用这些内容,但都不起作用。
对我来说,使用JNLP文件非常方便,因为我不需要关心平台检测、本地库甚至是主JOGL jar文件;我只需包含这一行,就可以完成所有的操作:
<extension name="JOGL" href="http://download.java.net/media/jogl/builds/archive/jsr-231-2.0-beta10/webstart/jogl-all-awt.jnlp" />

我希望能找到类似JNLP功能的替代方案。如果没有,我可以手动获取JOGL jar文件(或使用Ant),这不是什么大问题;只是JNLP为我做的一件事情,我真的会想念它。


有没有比JNLP文件更好的本地使用替代方案(即双击运行)?是否有什么优雅的方式,还是我只需要为Linux编写一个shell脚本、为Windows编写一个批处理文件,并让Ant检测和下载相应的JOGL jars?


如果有其他人有比下面更好的答案,请说出来!我仍然很想知道是否可以从本地文件系统运行JNLP文件。然而,经过一些研究,我已经决定这是不可能的,并且自己采用了一对脚本(run.bat和run.sh),我的Ant脚本使用条件标签并下载和解压缩正确的JOGL jar。我将很快提交一个包含Ant代码的答案。 - Ricket
5个回答

22
我已使用类似以下的.jnlp文件来在本地启动Java Web Start软件:
  1. 指定代码库,如下所示: <jnlp spec="1.0+" codebase="file://localhost/X:/path/to/jnlp/" href="software.jnlp">

  2. 使用相对路径列出资源: <resources> <jar href="lib/software.jar" main="true" /> <jar href="lib/softwareLibrary.jar" main="true" /> ... </resources>

  3. 最后告诉Web Start可以在标记为 main="true" 的jar中找到软件入口点: <application-desc main-class="com.example.Main" />

唯一需要在远程部署时更改的是代码库参数。

1
这不需要在本地主机上运行某种Web服务器或文件服务器来解析该路径吗? - Ricket
4
同时,如果省略codebase属性,则可以在本地启动。现在该属性是可选的:http://download.oracle.com/javase/6/docs/technotes/guides/javaws/developersguide/syntax.html - The Alchemist
是时候用JNLP替换所有的启动shell脚本了。这样做会更加整洁,而且还有平台检测等功能。 - whatnick
2
只有当我将代码库更改为:file:///X:/path/to/jnlp/(因此是三个正斜杠,然后是驱动器号),这才对我起作用。 - Adriaan Koster
就像@AdriaanKoster所说,只有当我使用file:///X:/blah/blah/blah时才有效,否则它会给我一个关于URI中“权限”的错误。 - Amber
显示剩余2条评论

4

只需从jnlp标签中删除属性codebasehref

<jnlp spec="1.0+">

从Java 1.6u18开始支持此功能。


2

JNLP系统在Java 6更新10中得到了改进(一段时间以前),但仍然很难调试(需要在Java控制台中启用完整跟踪并逐步执行javaws源代码)。

在您的情况下,我建议您再加把劲,让它正常工作。也许您可以提供一个显示问题的完整JNLP文件?


1

为您的jar使用清单文件。在那里,您可以定义要启动的主类和所需的库。请参阅清单规范中的Main-class和Class-path参数。


这样做的目的是让我只需双击JAR文件即可运行它,对吗? - Ricket
1
我不相信Manifest.MF允许指定本地库的位置。 - Thorbjørn Ravn Andersen
我没有注意到需要使用本地库,但是无论如何,通过清单属性,ant应该可以管理提供特定于平台的依赖项/软件包。 - Daniel Hiller

0

JNLP 专为网络启动(尤其是 http(s))而设计,没有网络,Java 实现必须会变得非常困惑。即使是成熟的项目,如 Eclipse,也坚持使用 .sh、.bat 选项。


不一定需要...NetBeans自带本地JNLP启动选项。此外,如果您查看@Shrike的评论,您会发现本地部署并不那么困难。 - The Alchemist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接