【问题标题】:How does JRE installation work?JRE 安装如何工作?
【发布时间】:2012-04-17 21:15:28
【问题描述】:

我正在打包我的软件,想知道 JRE 的安装是如何工作的。它是简单地复制本地系统上的二进制文件并相应地设置类路径,还是由安装程序完成任何其他步骤?

对于 Windows,JRE 二进制文件存储在 C:\Program Files\Java\jre7 中,我可以将此文件夹复制到其他机器(具有相同的 32 位或 64 位处理器)以使 JRE 工作。如果是这样,那么需要设置哪些环境变量?

【问题讨论】:

  • 我会从所有这些中得出一个结论。 Sun(现在是 Oracle 的)在应用程序中使用 JRE 的故事是缺乏的。如果只是为了一件事,与分发和使用 JRE 的无数问题相比,微软的 .NET 安装和引用是正确的。
  • “我正在打包我的软件” 使用Java Web Start(如果您打算在 2013 年 4 月之前完成此任务)。至于 JRE,请使用从 JWS 信息链接的deployJava.js。页面。
  • @AndrewThompson 谢谢,我正在打包一个离线应用程序。但是,当我将它作为在线分发移动时,这将很有帮助。可能是演示版。
  • “我正在打包一个离线应用程序。” 运行桌面 Java 且有网络连接但没有驱动器的机器(例如上网本)可能比有驱动器的机器多没有网络连接。 JWS 还解决了刻录(打印、包装、交付)CD/DVD 或闪存驱动器的成本。我认为您应该重新考虑典型最终用户的情况。但请注意(以防我误解你),JWS 有一个 offline-allowed 标志。这意味着即使没有连接到网络,用户也可以运行程序。

标签: deployment installation classpath java


【解决方案1】:

我可以将此文件夹复制到其他机器(具有相同的 32 位或 64 位处理器)以使 JRE 工作

是的,没问题。除非您还想注册 .jar 扩展名以便可以双击它们。

在这种情况下,请查看 ftypeassoc 命令。他们可以这样做,例如从批处理文件或安装程序中。

如果是这样,那么需要设置哪些环境变量?

无需设置任何环境变量。

只需确保在启动应用程序时(例如通过批处理文件)正确限定 javaw.exe(或 java.exe)的路径。

【讨论】:

    【解决方案2】:

    您可以将整个 JRE 放在一个子目录中,然后根据子目录引用 java.exe。其他产品经常这样做。

    您不需要设置任何环境变量。

    更新

    如果这是一个不是 JRE 工具包的商业应用程序(即 Maven 或 Ant 之类的东西),请不要依赖全局环境变量 JAVA_HOME、PATH 或 CLASSPATH 来设置。如果您想创建一个批处理文件,该文件在运行时会自动在您的应用程序的上下文中设置它,那将可以正常工作。但不要依赖它们在系统中设置。

    只需有人更改这些以使用 1.7 或 1.8 测试版的某个版本,或真正的 JRE 的任何子版本来破坏您的应用程序,然后您会收到有关您的应用程序破坏的客户支持电话,而他们实际上所做的只是将他们的 JAVA_HOME 更改为荒谬的东西,因为他们误读了 Ant 文档。

    如果您提供与 JDK 结合使用的工具集,例如 Ant 或 Maven,您可能希望使用它们安装的任何 JRE/JDK,因为这是您工具的重点。

    【讨论】:

    • 对不起,这根本不对。 许多 应用程序依赖于 CLASSPATHJAVA_HOME 和一些指向当前预期 JRE 的旧环境变量。如果您只是描述二进制文件,确实 Java 可以在没有它们的情况下工作,但如果没有这些变量,它会变得非常困惑,依赖它的应用程序也会如此。
    • @MrGomez 我工作过或使用过的商业应用程序都没有依赖于设置的 JAVA_HOME 或 CLASSPATH,因为依赖这些是确保应用程序无法运行的最快方法之一.当然,很多 Java 工具和 SDK 都使用这些工具,但我不知道有多少应用程序会这样做。甚至 Eclipse 也不参考或使用 JAVA_HOME 或 CLASSPATH。
    • 然而,许多 Apache 应用程序似乎都这样做了(例如,包括 Hadoop)。值得在这里记录一下这些,正是因为它们是极端情况,不幸的是,很常见。
    • @MrGomez 我不能说我会参考 Apache 应用程序作为如何运行应用程序的指南。此外,如果这是一个商业应用程序,我无法想象付费客户会对提示说 JAVA_HOME 未设置和应用程序退出而 Hadoop 所做的事情感到满意。它还在其配置开始时将 CLASSPATH 设置为单个值,以不获取现有 CLASSPATH 中列出的其他 JAR。任何做过 XML 处理的人都可以谈论混合 xerces JAR 文件的恐怖故事。
    • 我不反对。它在功能上与围绕 LD_LIBRARY_PATH 的恐怖故事相同:这不是一个好的做法,但您只知道 有人 会这样做。提出并彻底驳斥它是不好的做法,通常是最好的良药。 :)
    【解决方案3】:

    如果您不指定任何参数,JRE 安装程序会安装所需的二进制文件和可执行文件,但还会创建所需的 Windows 注册表项来配置您的 JRE 安装。

    您也可以使用“-static”选项进行安装(请参阅 JRE 安装程序 documentation),在这种情况下,除了将文件复制到指定路径之外,不会执行任何其他操作。

    然后您将需要手动设置环境变量。对于命令行,最常见的有:PATH、JAVA_HOME 和 CLASSPATH。

    【讨论】:

      【解决方案4】:

      简短的版本是,这取决于。但在大多数情况下,二进制兼容性和库路径的限制足以让 JRE 在共享环境中工作(就像我们在工作中的某些机器上所做的那样)。

      因为 Java 提供了一个虚拟机来处理请求,并且因为它可以完全独立于系统拥有的其他一些花里胡哨的东西来处理,所以您对它的类路径和二进制配置的直觉是正确的。 但是,您可能会遇到需要一组格式良好且系统特定的路径和库的库的问题,这些路径和库在第三方库提供的某些操作系统包中提供。 p>

      简而言之:如果您可以选择从其安装程序安装 Java,因为这将保证所有类路径详细信息、所有库、所有日志记录工具和所有特定于系统的勘误表都被考虑在内,尽管正如 Andrew Finnell 指出的那样,你会still need to set the environment variables manually。对于大多数需求,只有其中的一个严格子集是必需的(请参阅其他答案),但在界定此类问题时,最有趣的是极端情况。

      【讨论】:

      • 您意识到 Java 安装程序不会更改 PATH、JAVA_HOME 或 CLASSPATH 或在它们丢失时设置它们。试试看,自己看看。事实上,有一个关于它为什么不这样做的问题:stackoverflow.com/questions/560797/…
      • @AndrewFinnell 抱歉,您确实是正确的。我将这些与 JRE 的第三方包装(例如 CentOS 的包装)混淆了,它们确实设置和维护了这些。香草包装没有。我会更新我的答案。
      猜你喜欢
      • 2016-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-15
      相关资源
      最近更新 更多