Launch4J和Java Web Start的结合?

时间:2010-07-31 23:30:35

标签: java installer jnlp auto-update

我有一个有效的JNLP应用程序,我需要将其分发给各种非技术最终用户。

如果用户的计算机安装了最新的JVM,一切都很好。他们只需双击我发送的JNLP文件,其余的就是Java Web Start。

现在我想分发一些有或没有JVM的东西,例如:一个.exe文件,如果没有,则自动下载兼容的JVM,然后调用javaws.exe下载.jar文件并启动应用程序。

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

我想要的产品可以:

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

这样的产品是否存在?我怀疑它没有,但它值得一试。


更新我发现this article有一些相关问题的解决方案,虽然它专为离线安装而设计,我主要关注在线安装。

6 个答案:

答案 0 :(得分:4)

我能够做到这一点&在生产中使用它。

编写一个简单的bootstrap类,jar,然后启动jar4。

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

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
  }
}

答案 1 :(得分:2)

我遇到了同样的问题。我最终得到了一个BAT,一个Shell,最终是Mac的DMG。

我在使用Nullsoft安装程序的Windows自动化JRE安装中发现了这条评论:

http://nsis.sourceforge.net/Java_Launcher_with_automatic_JRE_installation

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

同样在Mac DMG AppBundle上,他们可以指定JRE。 Mac将拥有最新版本,除非是基于PowerPC的旧机器。在那种情况下没有Java6。

你最终有几个启动器,我会建议一个自动更新策略。

答案 2 :(得分:2)

您还可以考虑使用Excelsior JET编译项目。除了其他一切,它还创造了一个合理大小的自给自足的分布。

答案 3 :(得分:0)

另一种方法可能是使用带有/ S开关的.BAT文件分发Sun JRE,这会导致静默安装。

我还没有看到任何其他允许完全静默的Java安装以及调用javaws的东西。

答案 4 :(得分:0)

好的,我得到你想要做的但你为什么不想使用javaws? Launch4J看起来像是安装java的替代品,因为它可以无缝使用jar文件。

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

另外我不确定javaws是什么时候推出的,但我确信它在java 1.5中可用,我在EOL附近。因此,除非您的用户多年没有安装java,否则我怀疑他们启动jnlp会有问题。即使它们运行的​​是旧版本,您也可以向jnlp添加所需的java版本,这将仅为该应用程序自动下载。

答案 5 :(得分:0)

Though not free for non-commercial use, Install4j offers a native installer system for Java applications. JRE bundling is supported. I am not sure it can parse JNLP automatically, but it may be something worth checking out.

As an sample use case, the Java-based Integrated Genome Browser gets distributed with an installer generated by this tool. See its install4j configuration file.