我们有一个使用Java Web Start的Java应用程序.jnlp文件配置为[j2se version ="1.5+"].因此,如果安装了JRE 1.5和1.6,则应用程序将在1.6上运行.
现在,我们要求应将应用程序限制为仅在范围内运行 - JRE 1.5.0_07到JRE 1.5.0_17
[j2se version ="1.5*"]将无效 - 它将始终使用1.5系列中最新的jre启动应用程序.
我可以通过包含href属性来请求确切的产品版本.[j2se version ="1.5.0_14"href ="http://java.sun.com/products/autodl/j2se"/]
但是如何在jnlp文件中指定特定范围的JRE,以便JWS仅从该范围中获取JRE?因此,如果安装了1.5.0_07,1.5.0_17和JRE 6,它应该在1.5.0_17上运行应用程序.
有没有一个很好的方法来实现这一目标?
我正在使用JavaScript来执行JNLP,最终将执行我的客户端.
我试图通过JavaScript执行将参数传递给JNLP并通过我的客户端内的JNLP获取这些参数.
JavaScript正在执行此URL,例如:
http://localhost:8080/MyJnlp.jnlp?login=14hhh765p&pass=ggyyktff
Run Code Online (Sandbox Code Playgroud)
现在我的JNLP将尝试以<application-desc name tag这种方式获取参数:
<application-desc name="..." main-class="com.main.execute" >
<argument>-nosplash</argument>
<argument>-q</argument>
<argument><%=request.getParameter("login")%></argument>
<argument><%=request.getParameter("pass")%></argument>
</application-desc>
Run Code Online (Sandbox Code Playgroud)
但它没有用.
我无法以这种方式在我的客户端代码中检索这些参数:
login=getParamsFromJnlp("login")
..
public String getParamsFromJnlp(String key) {
return System.getProperty(key);
}
Run Code Online (Sandbox Code Playgroud)
JNLP在APACHE2.2中
知道什么是错的吗?
我们有一个通过使用SWT库的webstart启动的应用程序.
众所周知,osx需要swt库在主线程中运行,所以我们在jnlp中有这个:
<resources os="Mac">
<j2se version="1.6+" java-vm-args="-XstartOnFirstThread"/>
<jar href="swt-mac64.jar"/>
</resources>
Run Code Online (Sandbox Code Playgroud)
由于我们已经升级到Java 7(1.7.0_10),似乎webstart没有将"-XstartOnFirstThread"传递给它启动的java进程.
我可以从'ps'看到java进程没有得到"-XstartOnFirstThread"选项.
有谁知道如何让webstart回到之前的行为?
问候,戈德.
这是webstart日志显示的内容:
Java Web Start 10.10.2.18
Using JRE version 1.7.0_10-b18 Java HotSpot(TM) 64-Bit Server VM
User home directory = /Users/shier
----------------------------------------------------
c: clear console window
f: finalize objects on finalization queue
g: garbage collect
h: display this help message
m: print memory usage
o: trigger logging
p: reload proxy configuration
q: hide console
r: reload policy configuration
s: dump system and deployment properties
t: dump thread …Run Code Online (Sandbox Code Playgroud) 在java webstart文件(jnlp)中,您可以指定nativelib标记以加载二进制文件.您还可以通过指定os属性为不同的操作系统指定不同的操作系统.
例如:
<resources os="Linux">
<nativelib href="....jar"/>
</resources>
<resources os="Windows">
<nativelib href="....jar"/>
</resources>
<resources os="Mac OS X">
<nativelib href="....jar"/>
</resources>
Run Code Online (Sandbox Code Playgroud)
但是我怎样才能为不同的架构指定不同的二进制文件呢?例如win32和win64或linux 32和linux 64bit.操作系统.我在哪里可以找到os属性的选项列表?
在我的公司,我们使用Java Web Start将客户端软件分发给客户.他们使用不同的Windows版本:XP,Vista和7.
我们在过去通过JWS部署了一个版本最少的版本.我们的最新版本包括几个文件更改,一些罐子不见了,其他的出现了,等等.
我们发现Windows XP计算机上的升级失败,因为JWS仍然试图查找在Web服务器上不再可用的jar文件.我已经检查了我的HTTP服务器日志,并且在应用程序启动期间永远不会从XP机器上访问JNLP文件.如果我在Vista或Windows 7上尝试相同的一切正常,JWS将获取JNLP描述符并在更新可用时下载差异.因此,在XP机器上,只有已知的jar文件才会更新,如果JWS没有从缓存的JNLP文件集中找到某些内容,则会抛出错误.
我编写了一个手动生成JNLP文件的servlet.我在我的servlet代码中使用以下头配置.
response.setDateHeader("Last-Modified", lastModification);
// IE won't download JNLP file if Cache-Control header presents
//response.setHeader("Cache-Control", "no-cache, must-revalidate");
response.setHeader("Expires", "Mon, 26 Jul 1990 05:00:00 GMT");
Run Code Online (Sandbox Code Playgroud)
这使得JNLP文件总是过时的,这应该在每次客户端通过JWS启动时触发重新检查文件.我甚至可以在XP上的缓存查看器中看到这个日期:

我在Oracle的bugreport网站上发现了一个永远无法解决的问题:错误ID:6189106刚刚在Windows XP上对Java7进行了相同的测试,但这个问题仍然存在.但仅在XP上,因为部署缓存的路径中有空白字符("Documents and Settings").有人说,如果我将部署缓存的路径更改为没有空格字符的东西,它将解决问题.嗯,这不是一个真正的解决方案,因为用户几乎不能写到他们的个人资料以外的位置.
因为这个bug存在了这么长时间,我想应该有某种解决方法.我不想每次都告诉客户清除Java缓存并从Web重新安装应用程序.我们希望将来更快的发布周期,这将使其更加恶化.我希望有人对此有个好主意.:|
我正在学习Java并尝试使用Java web start运行一些示例.
但是,我似乎无法找到那个包javax.jnlp.
同样的错误让我在windows和linux上都遇到了困难.我在windows上安装了oracle jdk 7.OpenJDK 1.6是在linux上安装的版本.
在互联网上搜索没有运气的包裹.它在oracle的网站上已不再可用,因为他们坚持认为该软件包是jdk的一部分.
我搜索了安装目录中的it.some声称它在jnlp.jar文件中,其他人在javaws.jar文件中声明...这两个文件都不是我安装的一部分.
随着Apple在Java上的Java 6的最新更新,它不仅禁用了Web浏览器支持,还禁用了Java Web Start.我将javaws与需要Java 6和32位的应用程序一起使用.Java 6仍然存在于我的系统中,但javaws不起作用:
James-Babkas-iMac:~ jimbabka$ java -version
java version "1.6.0_37"
Java(TM) SE Runtime Environment (build 1.6.0_37-b06-434-11M3909)
Java HotSpot(TM) 64-Bit Server VM (build 20.12-b01-434, mixed mode)
James-Babkas-iMac:~ jimbabka$ javaws http://foo.bar.org/bgameui/bgameui.jnlp
No Java runtime present, requesting install.
Unable to locate a Java Runtime to invoke.
Run Code Online (Sandbox Code Playgroud)
当我运行javaws命令时,我收到一条弹出消息,指示我进入Oracle网页,在那里我可以下载64位Java 7,这对我没用.有没有办法让javaws再次使用32位Java 6?
我正在使用Java Web Start来启动依赖于某些第三方本机库的Java应用程序.然后,这些本机库commonLib使用LoadLibrary/dlopen 加载另一个本机库()作为它们的依赖项.
不使用Web Start时,当本机库位于同一目录中时,一切都按预期工作.
但是,Web Start要求将本机库打包在jar文件中并在jnlp文件中引用,我这样做了:
<!-- Windows OS -->
<resources os="Windows">
<nativelib href="native/native-windows.jar" />
</resource>
<!-- Linux OS -->
<resources os="Linux">
<nativelib href="native/native-linux.jar" />
</resources>
<!-- Mac OSX -->
<resources os="Mac OS X">
<nativelib href="native/native-osx.jar"/>
</resources>
Run Code Online (Sandbox Code Playgroud)
本机库加载正常但它们无法加载它们的依赖项commonLib- C++ LoadLibrary/dlopen调用失败,因为该文件存在于某个jar/cache文件夹中而不是当前库搜索路径中.
在Windows上,我能够commonLib在尝试加载JNI库之前通过在Java中预加载来解决此问题,如下所示:
System.loadLibrary("commonLib");
System.loadLibrary("myNativeLib");
Run Code Online (Sandbox Code Playgroud)
但是,这种方法在OS X上不起作用 - 本机代码中的dlopen失败.dlopen显然不够聪明,如果它已经加载,不再尝试加载库.
是否有一种跨平台的方式来打包和加载依赖于Java Web Start中其他本机库的本机库?
我有代码迭代classLoader.getResources("META-INF/MANIFEST.MF")的结果,以返回类路径上的jar列表.这从1.6.0_18一直到1.7.0_40都很好.现在1.7.0_45通过显示有关混合签名/未签名代码的安全警告弹出窗口来打破此问题.
用于演示问题的小型自包含测试用例:
package testcase;
import java.io.*;
import java.net.*;
import java.util.Enumeration;
import java.util.logging.*;
public class TestCase {
public static void main(String[] args) {
getAllJarUrls();
}
public static void getAllJarUrls() {
try {
final Enumeration<URL> mfUrls = Thread.currentThread().getContextClassLoader().getResources("META-INF/MANIFEST.MF");
while (mfUrls.hasMoreElements()) {
URL jarUrl = mfUrls.nextElement();
if (!jarUrl.getProtocol().equals("jar")) {
continue;
}
try {
System.out.println(jarUrl.toURI());
} catch (URISyntaxException ex) {
Logger.getLogger("testcase").log(Level.SEVERE, null, ex);
}
}
} catch (IOException e) {
Logger.getLogger("testcase").log(Level.SEVERE, null, e);
}
}
}
Run Code Online (Sandbox Code Playgroud)
使用jnlp(使用有效证书签名的jar)启动它,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.0+" codebase="http://localhost/test" href="test.jnlp"> …Run Code Online (Sandbox Code Playgroud) 要求是自动化java webstart进程.单击JNLP文件后,加载并显示下面的图像

这里始终没有信任的选择.我知道在Java 7 Update 51中,java收紧了安全性.所以我签署了由赛门铁克提供的公共代码签名证书的罐子,因此不需要在java控制面板例外列表中添加此站点或降低安全级别(两者都不允许在客户环境中).有没有可能让这个安全问题消失并自动运行罐子?
解
在MANIFEST.MF中添加了以下两个属性,并且它有效.
Codebase: *
Application-Library-Allowable-Codebase: *
Run Code Online (Sandbox Code Playgroud) java ×10
java-web-start ×10
jnlp ×5
macos ×2
apache ×1
code-signing ×1
distribution ×1
import ×1
java-7 ×1
swt ×1
web ×1