java—如何处理多个jre和单个jar文件

bogh5gae  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(271)

我目前正在开发一个java程序,但是对于如何在多个没有相同jre版本的操作系统上运行jar文件,我感到有点迷茫。
让我解释一下:
我正在开发的程序是用1.7编写的
客户端需要它在mac os(jre 1.6)和windows(jre 1.7)上工作
我在eclipse中使用maven生成了一个.jar可执行文件
我怎样才能让它同时在他的mac操作系统和windows上运行呢?有没有办法用jar文件导出相应的jre?
谢谢!

mjqavswn

mjqavswn1#

你在这里有很多不同的问题。
我正在开发的程序是用1.7编写的。客户端需要它在mac os(jre 1.6)和windows(jre 1.7)上工作
一般来说,如果java应用程序可以为较旧的平台(例如Java6)编译,那么编译后的代码应该在较新的平台上运行。但反之则不适用。这主要有两个原因。
java .class 文件格式有版本控制,较新的jre可以加载具有较旧格式的类。但是旧的jre不能用新的格式加载类。
此外,还对类文件格式进行了更改,以支持新的语言特性。因此,如果您的源代码使用(比如)java7中添加的特性,那么您将无法编译代码以在(比如)java6上运行。
每个版本的java都会向类库中添加新的类和接口,并向现有的类中添加新的方法。如果您针对Java6SEAPI编译代码,那么它应该与JavaSE7平台兼容(但是,如果您根据Java7SEAPI编译代码,那么代码可能依赖于Java6中不存在的类和方法。
简而言之,如果希望应用程序在Java6上运行,则需要编译并在Java6上测试它。您还需要与Java6兼容的所有应用程序依赖项的版本。
上述问题的另一个方面是支持不同的操作系统(macos和windows)。如果您的应用程序是纯java的,并且没有线程问题,那么应该可以。出现以下问题:
你的应用程序依赖于特定于平台的东西;e、 g.路径名语法、外部命令、本机库或
您的应用程序包含本机代码,或使用 Unsafe 或者抽象破坏反射,或者依赖于jre内部API,或者
您的应用程序对线程调度器做出了不必要的假设,或者没有严格遵循管理内存可见性的规则(在java内存模型中定义),或者
您的应用程序使用第三方库处理上述任何问题。
我在eclipse中使用maven生成了一个.jar可执行文件
生成jar文件的方式并不重要。重要的是编译代码的目的是什么java目标,以及编译代码的依据是什么javaapi。
有没有办法用jar文件导出相应的jre?
不适用于Java6或Java7。jre不是jar文件的一部分。对于这个版本的java,选项是让客户机作为单独的步骤安装jre,或者创建一个安装程序来安装您的应用程序和它所需要的jre。
Java9引入了一个名为 jlink 这将从jar文件生成一个可安装的自包含java。它们不需要单独的jre,因为它们有一个精简的jre作为可安装程序的一部分。
最后,一句忠告。仔细考虑支持Java6客户是否真的符合您的长期利益
Java6和Java7都是生命的终结。此外,许多第三方库的提供商已经停止支持Java8之前的版本。如果您承诺支持需要java6的客户机,那么这可能会带来严重的问题(甚至会显示stoppers)。
此外,支持这个客户机将意味着您的应用程序代码库将无法使用Java8和更高版本中新的语言特性和改进的API。一些更重要的语言和api更改包括:
试用资源(Java7)
lambdas、方法引用、类型推断、流和改进的日期/时间处理( java 8)
模块(java 9) var (java 10)
记录(java 15)
这可能会导致您的代码库变得越来越过时,并且需要重写。

2nbm6dog

2nbm6dog2#

检查maven编译器插件:https://maven.apache.org/plugins/maven-compiler-plugin/examples/set-compiler-source-and-target.html 但是请记住,如果您使用的是Java7特性(例如try with resources),那么当您的客户机(1.6)运行它时,代码将失败。所以我建议使用源和目标都是1.6。

相关问题