【问题标题】:How to deal with multiple jre and a single jar file如何处理多个jre和一个jar文件
【发布时间】:2021-03-24 06:47:28
【问题描述】:

我目前正在开发一个java程序,但是我对如何在多个不具有相同jre版本的操作系统上运行jar文件感到有点迷茫。

让我解释一下:

  • 我正在开发的程序是用 1.7 编写的
  • 客户端需要它在 Mac OS (jre 1.6) 和 Windows (jre 1.7) 上工作
  • 我在 Eclipse 中使用 Maven 生成了一个 .jar 可执行文件

我怎样才能让它同时在他的 MAC OS 和 Windows 上运行? 有没有办法用jar文件导出对应的jre?

谢谢!

【问题讨论】:

    标签: java operating-system executable-jar


    【解决方案1】:

    这里有很多不同的问题。

    我正在开发的程序是用 1.7 编写的。客户端需要它在 Mac OS (JRE 1.6) 和 Windows (JRE 1.7) 上工作

    作为一般规则,如果 Java 应用程序可以针对较旧的平台(例如 Java 6)进行编译,则编译后的代码应该在较新的平台上运行。但反过来适用。这有两个主要原因。

    • Java .class 文件格式是版本化的,较新的 JRE 可以加载具有较旧格式的类。但较旧的 JRE无法加载具有较新格式的类。

      此外,对类文件格式的更改是为了支持新的语言功能。因此,如果您的源代码使用(例如)Java 7 中添加的功能,那么您将无法编译代码以在(例如)Java 6 上运行。

    • 每个版本的 Java 都会向类库添加新的类和接口,并为现有的类添加新的方法。如果您针对 Java 6 SE API 编译代码,那么它应该与 Java SE 7 平台兼容。 (所有必需的类都应该存在。)但是,如果您针对 Java 7 SE API 编译代码,则代码可能依赖于 Java 6 中不存在的类和方法。

    简而言之,如果您希望您的应用程序在 Java 6 上运行,您需要在 Java 6 上对其进行编译和测试。您还需要与 Java 6 兼容的所有应用程序依赖项的版本。


    上述问题的另一方面是支持不同的操作系统(Mac OS 和 Windows)。如果您的应用程序是纯 Java 并且没有线程问题,那应该没问题。如果出现问题:

    • 您的应用程序取决于平台特定的东西;例如路径名语法、外部命令、本机库或

    • 您的应用程序包含本机代码,或使用 Unsafe 或抽象破坏反射,或者它依赖于 JRE 内部 API,或者

    • 您的应用程序对线程调度程序做出了毫无根据的假设,或者没有严格遵守管理内存可见性的规则(在 Java 内存模型中定义),或者

    • 您的应用程序使用 3rd-party 库来解决上述任何问题。


    我在 Eclipse 中使用 Maven 生成一个 .jar 可执行文件

    生成 JAR 文件的方式无关紧要。重要的是代码编译的 Java 目标以及编译的 Java API。


    有没有办法用JAR文件导出对应的JRE?

    不适用于 Java 6 或 Java 7。JRE 不是 JAR 文件的一部分。对于这个 Java 年代,选项是让客户端安装 JRE 作为单独的步骤,或者创建一个安装程序来安装您的应用程序和它所需的 JRE。

    Java 9 引入了一个名为 jlink 的新实用程序,它将生成可从 JAR 文件安装的自包含 Java。这些不需要单独的 JRE,因为它们有一个缩减的 JRE 作为可安装的一部分。


    最后,提个建议。仔细考虑支持 Java 6 客户是否真的符合您的长期利益

    Java 6 和 Java 7 都已报废。此外,许多 3rd 方库的提供者已停止支持 Java 8 之前的版本。如果您承诺支持需要 Java 6 的客户端,这可能会带来严重的问题(甚至显示停止程序)。

    此外,支持此客户端将意味着您的应用程序代码库将无法使用 Java 8 及更高版本中的新语言功能和改进的 API。一些更重要的语言和 API 更改是:

    • 资源尝试 (Java 7)
    • Lambda、方法引用、类型推断、流和改进的日期/时间处理。 (Java 8)
    • 模块 (Java 9)
    • var (Java 10)
    • 记录 (Java 15)

    这可能会导致您的代码库变得越来越过时,需要重写。

    【讨论】:

      【解决方案2】:

      检查 maven-compiler-plugin:https://maven.apache.org/plugins/maven-compiler-plugin/examples/set-compiler-source-and-target.html 但请记住,如果您使用 Java 7 功能(例如 try-with-resources),则当您的客户端 (1.6) 运行代码时,代码将失败。所以我建议将源和目标都用作 1.6。

      【讨论】:

        猜你喜欢
        • 2015-05-26
        • 2013-04-11
        • 2013-01-11
        • 1970-01-01
        • 2010-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多