这里有很多不同的问题。
我正在开发的程序是用 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)
这可能会导致您的代码库变得越来越过时,需要重写。