8

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

如果用户的机器安装了最近的 JVM,那么一切都很好。他们只需双击我发送给他们的 JNLP 文件,其余的由 Java Web Start 完成。

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

Launch4J 是我找到的最接近的匹配项,但它无法通过javaws.exe. 唯一的选择是javajavaw

我想要一个可以:

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

有这样的产品吗?我怀疑它没有,但值得一试。


更新我发现这篇文章有一些相关问题的解决方案,虽然它是为离线安装而设计的,我主要关心在线安装。

4

6 回答 6

4

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

编写一个简单的引导类,将其 jar 和 Launch4j 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
  }
}
于 2012-01-04T00:01:55.960 回答
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。

你们当中有几个启动器,我会推荐一个自动更新策略。

于 2010-08-11T11:58:41.697 回答
2

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

于 2010-08-11T14:21:39.113 回答
0

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

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

于 2010-07-31T23:41:57.183 回答
0

好的,我明白你想要做什么,但你为什么不想使用 javaws?Launch4J 看起来是替代安装 java 的一个不错的选择,因为它将允许无缝使用 jar 文件。

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

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

于 2010-08-11T04:24:10.527 回答
0

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

作为示例用例,基于 Java 的集成基因组浏览器随此工具生成的安装程序一起分发。查看它的 install4j配置文件

于 2015-11-12T11:38:51.530 回答