在浏览器中下载JNLP后,它会被缓存,因此不需要再次下载,这很好.但是,因此,如果我更新JNLP使用的JAR,用户仍将看到缓存中的旧版本应用程序.
您可以通过在终端中运行它来清除缓存:
javaws -uninstall
Run Code Online (Sandbox Code Playgroud)
但很明显,当您的更新准备就绪时,用户无法运行此命令.它应该比这更无缝.
一个想法是更改jnlp文件名,以便下载新文件,如MyJWS-01.jnlp,以包含版本号.
还有其他方法吗?
我们最近将Jenkins升级到最新版本.
从那时起,每当我尝试启动它时,我都无法通过命令行通过Java WebStart启动从属设备我得到"无法启动应用程序"错误
在详细信息面板中使用此功能
CouldNotLoadArgumentException[ Could not load file/URL specified: http://MyServer:8080/computer/Slave1/slave-agent.jnlp]
at com.sun.javaws.Main.launchApp(Unknown Source)
at com.sun.javaws.Main.continueInSecureThread(Unknown Source)
at com.sun.javaws.Main.access$000(Unknown Source)
at com.sun.javaws.Main$1.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
当尝试浏览Jenkins站点并从那里进行午餐时,IT WORKS然后如果您再重新启动该框,则启动时的命令行无法完成该任务.
这是我试图从奴隶运行的命令
cd "C:\Program Files (x86)\Java\jre7\bin"
javaws http://MyServer:8080/computer/Slave1/slave-agent.jnlp
Run Code Online (Sandbox Code Playgroud)
问题是这曾经奏效.我也尝试更新到最新版本的Java,但没有运气,
任何想法有人吗?
从JRE 1.7.0_21升级到1.7.0_25-b15后,我的应用程序在从Java WebStart运行时开始在SwingUtilities.invokeLater(...)中抛出NullPointerException.令人惊讶的是,当它作为一个独立的应用程序(在JWS之外)执行时,它运行良好.
这是堆栈的顶部:
Exception in thread "AWT-EventQueue-2" java.lang.NullPointerException
at sun.awt.SunToolkit.getSystemEventQueueImplPP(SunToolkit.java:1011)
at sun.awt.SunToolkit.getSystemEventQueueImplPP(SunToolkit.java:1007)
at sun.awt.SunToolkit.getSystemEventQueueImpl(SunToolkit.java:1002)
at java.awt.Toolkit.getEventQueue(Toolkit.java:1730)
at java.awt.EventQueue.invokeLater(EventQueue.java:1217)
at javax.swing.SwingUtilities.invokeLater(SwingUtilities.java:1290)
at AppletView$8.setBaseUnits(AppletView.java:536)
(...)
Run Code Online (Sandbox Code Playgroud)
为了全面了解:方法setBaseUnits(..)被远程服务器从RMI调用为回调.完整的堆栈跟踪很长.
安全模型中是否有某些内容在RMI或JWS中发生了变化,可能会破坏事物?如果是这样,我会期待一些安全性异常,但它可能是在JRE中未正确检测到的并导致NPE.
任何建议表示赞赏.
----更新1 :
JRE 1.7.0_25更新可能存在类似的问题,可能涉及一些安全更改和AppContext对象:https : //forums.oracle.com/message/11080621 https://forums.oracle.com/thread/2552799.我尝试过建议修复:https://forums.oracle.com/message/11082162#11082162但没有任何成功.
我可以在我的应用程序中看到3个AWT-EventQueue线程,数字从0到2.看起来如果JWS启动程序,JRE会为不同的应用程序上下文创建额外的事件队列.JWS中有3个AppContext和3个EVT,如果从IDE执行程序,则只有一个上下文和EVT.
----更新2 :
下面的guruman建议有一个解决方法(非常感谢).不幸的是,SwingUtilities.invokeLater(..)必须替换对来自RMI线程的所有调用,并且程序开始依赖于Sun JRE内部API.
我仍然在寻找更具体的方法,而不是针对Sun JRE.我认为这是一个JRE错误.也许它可以以某种方式修补:在RMI线程中AppContext不应为null.
----更新3:
我做了一个简单的测试用例来说明问题.它包含4个文件.要运行此测试用例,需要签署目标jar(TestCase.jar).首先在launch.jnlp中指定正确的代码库,然后通过Java Web Start运行服务器(例如,使用javaws launch.jnlp).屏幕上应显示以下框架:

然后可以执行RMI客户端.成功执行后,框架应包括:

但是如果您尝试使用JWS执行服务器您将在客户端程序中获得以下异常(异常从RMI服务器传播到RMI客户端):
Exception in thread "main" java.lang.NullPointerException
at sun.awt.SunToolkit.getSystemEventQueueImplPP(SunToolkit.java:1011)
at sun.awt.SunToolkit.getSystemEventQueueImplPP(SunToolkit.java:1007)
at sun.awt.SunToolkit.getSystemEventQueueImpl(SunToolkit.java:1002)
at java.awt.Toolkit.getEventQueue(Toolkit.java:1730)
at java.awt.EventQueue.invokeLater(EventQueue.java:1217)
at javax.swing.SwingUtilities.invokeLater(SwingUtilities.java:1290)
at testcase.RmiServiceImpl.callBack(RmiServiceImpl.java:70)
at …Run Code Online (Sandbox Code Playgroud) 我开发了一个开源程序WPCleaner,它通过Java Web Start分发.当前版本可从http://site4145.mutu.sivit.org/WikiCleaner/WikiCleaner.jnlp获取
随着Java的最新更新,当您需要应用程序具有一些权限(写入首选项,访问其他网站,......)时,通过Java Web Start部署Java应用程序变得越来越困难
我的应用程序是自签名的,之前还可以,但是新的更新要求用户在每次运行时都接受应用程序,而不仅仅是一次性,如果他们愿意的话.所以,我决定使用可信证书来签署我的申请.
我从Certum得到了一个(显然,他们对开源开发人员是免费的),继这个讨论之后:开源项目的代码签名证书?
我已经生成了一个新的jar文件,使用此证书签名(jar文件可从http://site4145.mutu.sivit.org/WikiCleaner/WikipediaCleanerTest.jar获得),但我仍有问题:当我通过JWS启动应用程序时,Java仍然会显示一个警告窗口,让我一劳永逸地信任该应用程序.编辑器仍然显示为UNKNOWN,但是当我查看消息的详细信息时,这是我从Centrum使用的新证书.
有没有人知道我做错了什么?我认为拥有来自可信CA(Centrum似乎是Java cacerts)的证书将允许用户一劳永逸地接受证书.
谢谢
PS:当我运行时jarsigner -verify,我收到以下警告"此jar包含其证书链未经过验证的条目."
示例:我有两个共享对象(同样应该适用于.dll).第一个共享对象来自第三方库,我们称之为libA.so. 我用JNI包装了一些并创建了我自己的库libB.so. 现在libB依赖于libA.
在webstarting时,两个库都在某个webstart工作区中.我的java代码试图加载libB.此时系统加载程序将尝试加载不在系统库路径中的libA(java.library.path不会帮助它).最终结果是libB有一个不满意的链接,无法使用.
我试过在libB之前加载libA,但是仍然无效.似乎操作系统想为我加载.除了静态编译之外,我有什么方法可以完成这项工作吗?
我已经在网络开始工作了几年,并且有签署罐子的经验,什么不是.我正在第一次尝试使用Web start部署RCP应用程序,虽然我实际上已使用相同的证书签署了所有的jar,但我仍然收到此错误:'jnlp中的jar资源未使用相同的证书签名'
还有其他人遇到过这个吗?如果是这样,有关如何解决的任何想法?
我正在启动一个突然关闭的Java Web Start应用程序.有没有人知道如何访问Java Web Start的日志.是否有任何已知原因导致其突然关闭?
自Java 8 Update 111以来,我们的一些客户无法再运行我们的Java Web Start客户端了.他们得到:
java.io.IOException:无法通过代理进行隧道传输.代理返回"需要HTTP/1.1 407代理身份验证
看起来它与此更改有关:
现在,默认情况下,在为HTTPS设置隧道时需要基本身份验证的代理将不再成功.如果需要,可以通过从jdk.http.auth.tunneling.disabledSchemes网络属性中删除Basic,或者通过在命令行上将同名的系统属性设置为""(空)来重新激活此身份验证方案.
如果客户不愿意改变他们的代理身份验证方法,有什么办法吗?
注意:添加<property name="jdk.http.auth.tunneling.disabledSchemes" value=""/>到<resources>JNLP无效.这是因为这种方式只支持少数属性(本页底部附近有一个列表)."jdk.http.auth.tunneling.disabledSchemes"不在其中.
我们正在寻找Java web start的替代方案,它可以有效地执行相同的操作,只是更好地实现.我们遇到了大麻烦.我们有一些XP桌面办公室,所有办公室都略有不同,到目前为止只有少数办公室没有认真调整.问题与不能很好地使用代理设置(使用Java控制面板中的直接连接允许它工作),拒绝在设置"-Xmx"之类的参数时运行但在不运行时运行正常(直到它运行内存不足)和其他我们无法解决的奇怪问题.
Web开始工作的方式正是我们想要的,即连接到具有应用程序的服务器,下载任何已更改的内容,保留jar缓存等.其他团队在这里使用'clickonce'作为他们的C#应用程序,它确实有效地同样的事情,但似乎没那么麻烦.
我确信我们并不是唯一遇到这种情况的人,但搜索并没有真正显示任何替代方案.我们已经考虑编写一个存根本地应用程序,它本质上只是一个URLClassLoader,它可以动态地通过网络加载我们的应用程序,但不幸的是,它与其他办公室相比太慢了.有人有主意吗?
谢谢
更新
如果有人对最终发生的事情感到好奇,我们在一个月左右的时间里给了webstart但是继续遇到问题所以我们实现了自己的版本.它基本上只是一个存根,它有一个指向Web服务器的URL类加载器.这是<200行代码,它已经运行了好几个月.这不是理想的,但在有人改进webstart之前我们会坚持下去.
更新2018年
所以,几年后,我正在研究一个同样问题的新项目.这次我们使用的是getdown,而不是编写我们自己的webstart实现.我们发现这是对网络开始的巨大改进,它对我们来说非常好.
我有一个基于Java 6的Java Web Start应用程序,我需要在Windows机器上打开它.机器安装了JRE 7,手动将JRE 6复制到该Program Files文件夹.问题在于,无论何时我想打开JWS应用程序,它都会使用Java 7打开.即使我使用javawsJRE 6中的可执行文件,一些属性仍然引用JRE 7文件(我通过使用验证了这一点javaws -verbose app.jnlp.我如何强制使用JRE 6仅适用于此应用程序?
java ×10
java-web-start ×10
jnlp ×3
certificate ×1
code-signing ×1
deployment ×1
https ×1
jenkins ×1
proxy ×1
rcp ×1
rmi ×1
swing ×1
tunneling ×1
windows ×1