Launch4J和Java Web Start的结合?

Launch4J和Java Web Start的结合?,java,installation,jnlp,auto-update,Java,Installation,Jnlp,Auto Update,我有一个正在工作的JNLP应用程序,需要分发给各种非技术性的最终用户 如果用户的机器安装了最新的JVM,则一切正常。他们只需双击我发送给他们的JNLP文件,JavaWebStart就会完成其余的工作 现在,我想发布一些可以使用或不使用JVM的东西,例如.exe文件,如果没有兼容的JVM,它会自动下载兼容的JVM,然后调用javaws.exe下载.jar文件并启动应用程序 Launch4J是我找到的最接近的匹配项,但它无法通过javaws.exe启动程序。唯一的选项是java和javaw 我想要一

我有一个正在工作的JNLP应用程序,需要分发给各种非技术性的最终用户

如果用户的机器安装了最新的JVM,则一切正常。他们只需双击我发送给他们的JNLP文件,JavaWebStart就会完成其余的工作

现在,我想发布一些可以使用或不使用JVM的东西,例如
.exe
文件,如果没有兼容的JVM,它会自动下载兼容的JVM,然后调用
javaws.exe
下载.jar文件并启动应用程序

Launch4J是我找到的最接近的匹配项,但它无法通过
javaws.exe
启动程序。唯一的选项是
java
javaw

我想要一款能够:

  • 生成一个独立的
    .exe
    文件,该文件不需要预先安装JVM
  • 解析
    .jnlp
    文件,并在必要时确定要下载的正确JVM(我知道Java Web Start可以在必要时下载JVM,但我希望避免必须下载两个,第一个用于引导Java Web Start,第二个用于运行可能需要特定但不同JVM的应用程序。)
  • 自动下载并安装JVM,而不是简单地将用户引导到Java下载页面或打开新的安装向导
  • 必要时提示输入管理员密码(获取安装JVM的权限。我认为这不是Sun JVM安装程序内置的。)
  • 只显示一个安全对话框(我只想提示用户一次,以确认他们信任生成的
    .exe
    ,但我不想第二次提示,以确认他们信任
    .jar
    文件,该文件将来自同一来源并使用同一证书签名。)我假设这需要自动下载程序在启动JWS之前安装证书。)
  • (非必需)在后台与JVM同时下载应用程序资源(例如
    .jar
    文件)。这需要在安装JVM之前运行缓存,因此缓存必须在本机代码中实现,并且
    DownloadService
    稍后将使用JNI与之接口
这样的产品存在吗?我想不会,但值得一试



更新我发现它解决了一些相关问题,尽管它是为离线安装而设计的,我最关心的是在线安装。

另一种方法可能是分发一个带有.BAT文件的Sun JRE,通过/S开关调用它,从而导致静默安装


我没有看到任何其他允许完全静默Java安装与调用javaws相结合的东西

好的,我知道你想做什么,但是为什么不使用javaws呢?Launch4J看起来是一个很好的选择,可以替代安装java,因为它允许无缝地使用jar文件

javaws或多或少地使用具有安全权限和一些启动选项的java.exe。但是,如果使用用户信任的证书,则可以禁用安全权限


我也不确定javaws是什么时候引入的,但我确信它在接近EOL的Java1.5中是可用的。因此,除非您的用户已经多年没有安装java,否则我怀疑让他们启动jnlp将是一个问题。即使他们运行的是较旧的版本,您也可以向jnlp添加所需的java版本,并且该版本将仅自动为该应用程序下载。

我遇到了相同的问题。我最后得到了一个蝙蝠,一个外壳,最后是一个苹果电脑的DMG

我在使用Nullsoft installer的Windows自动JRE安装中发现了以下评论:

我认为在JNLP之外,很难实现所有平台的自动化。然而,在我的项目中,两年来,我没有看到关于用户必须自己获得java的抱怨。我相信大多数机器已经有了它。Windows用户抱怨没有快捷方式,但使用vbs很容易做到

同样在Mac-DMG-AppBundle上,它们也是指定JRE的方法。Mac将使用最新版本,除非是基于PowerPC的旧机器。在这种情况下,没有Java6


如果你最终有几个启动器,我会推荐一个自动更新策略我已经能够做到这一点,并在生产中使用它

编写一个简单的引导类,jar,然后启动4j jar

下面是简单引导类的主要内容:

public static void main(String[] args) {
  try {     
    final File jnlp = File.createTempFile("temp", ".jnlp");
    final URL url = new URL("http://yourjnlp-wherever-youre-hostingit.jnlp");
    yourCopyStreamMethodYouWrote(url.openStream(),new FileOutputStream(jnlp));
    Desktop.getDesktop().open(jnlp);
  } catch (final Throwable t) { 
     // do something useful here
  }
}

尽管并非免费用于非商业用途,但它为Java应用程序提供了本机安装程序系统。支持JRE绑定。我不确定它是否能自动解析JNLP,但它可能值得一试


作为一个示例用例,基于Java的应用程序将与此工具生成的安装程序一起分发。参见其install4j

我确实想使用javaws。有问题的例子是一台从未安装过Java的PC。我不太担心非windows平台。Mac总是安装有JVM,我认为大多数linux用户都有技术知识,可以在必要时查找并双击
.jar
文件。这听起来是正确的方法。launch4j确保存在一个JVM(我不知道它是否可以自动安装或随身携带),并调用代码。然后,代码简单地告诉浏览器启动JNLP脚本。这很聪明,但是对于这个类和Java Web Start应用程序,您不需要两个nag屏幕(安全nag,“您想运行吗”)?