maven 将我的项目编译成什么 Java 的主要和次要版本?
What major and minor version of Java did maven compile my project to?
我有一个使用 maven 编译成 ear 文件的项目。这是用于编译代码的内容:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<source>1.6/source>
<target>1.6</target>
</configuration>
</plugin>
有没有办法确定用于编译代码的 Java maven 的次要版本?
更新:
通过执行以下操作,我可以仅使用从 maven 构建生成的 ear 文件来获取主要版本和次要版本:
- 使用 zip 文件工具提取 ear 文件以获取包含的文件
- 从提取的文件中找到从我的源代码生成的 jar 文件之一
- 运行 javap 使用以下内容(来自 jar 文件所在的目录):
javap -classpath ./myjarfile.jar -verbose -c com.myorg.myproj.MyClass
输出的开头如下所示:
Classfile jar:file:/C:/TEMP/myjarfile.jar!/com/myorg/myproject/MyClass.class
Last modified May 26, 2017; size 944 bytes
MD5 checksum 37996ea9840df04afb5485fedd861f8e
Compiled from "MyClass.java"
public class com.myorg.myproj.MyClass extends com.myorg.myproj.SomeOtherClass
SourceFile: "SomeOtherClass.java"
minor version: 0
major version: 50
flags: ACC_PUBLIC, ACC_SUPER
看来我的 class 是使用主要版本 50 和次要版本 0 编译的。
但是,问题仍然存在,Java 的哪个特定版本用于编译代码?如果您在 cmd 提示符下键入 "java -version"(例如 java 版本“1.7.0_51”),我希望得到类似的结果。
就 "java -version" 版本而言,50.0 映射到什么?
关于这种类型的映射有很多帖子,但它们似乎都只映射主要版本。其中包括:
List of Java class file format major version numbers?
https://blogs.oracle.com/darcy/source%2c-target%2c-class-file-version-decoder-ring
http://www.rgagnon.com/javadetails/java-0544.html
另外,我编译代码的机器上好像没有安装Java1.6的环境,所以不清楚maven是用什么编译代码的Java 1`.6。
您确实不需要 特定 版本的 JDK。但是,如果您这样做,请使用 Maven 帮助站点上显示的 XML 片段:
<configuration>
<verbose>true</verbose>
<fork>true</fork>
<executable><!-- path-to-javac --></executable>
<compilerVersion>1.3</compilerVersion>
</configuration>
您通往 JavaC 的路径如下所示:C:\Program Files\Java\j2sdk1.4.2_09\bin\javac
。当然,您必须找到您的实际 Java JDK 位置。
当您使用 Maven 编译 Java 类 时,有多个角色在起作用,因此您应该了解您感兴趣的 版本。
- Maven 和 maven-compile-plugin
- 它又使用 plexus-compiler - 编译器适配器
- Java 编译器 -
javax.tools.JavaCompiler
called from the plugin, the javac
command, or another compiler 实现取决于 Maven 的配置
- 生成的 JVM 字节码
如果没有使用自定义配置,Maven 编译器插件需要一个 Java 编译器到 运行,如果您没有 JDK(仅 JRE),将会失败机器。如果您 运行 mvn
命令和 -X
(例如 mvn -version -X
),它将打印有关它使用的 Java 安装的详细信息。在大多数情况下,将使用来自该安装的编译器。请注意 Java home
指向 JRE,但它是 JDK 的一部分。您可以通过 运行 使用 -X
.
构建来找到有关编译器插件的其他有用信息
Apache Maven 3.3.9
Maven home: /usr/share/maven
Java version: 1.8.0_131, vendor: Oracle Corporation
Java home: /usr/lib/jvm/java-8-openjdk-amd64/jre
Maven 通过在工件的清单 (META-INF/MANIFEST.MF
) 中包含构建 JDK 版本,让我们的生活变得更加轻松。
Created-By: Apache Maven 3.3.9
Build-Jdk: 1.8.0_121
源和目标版本
为了生成 1.6 字节码,Java 编译器不必是同一版本。这叫做"cross-compilation". So, your configuration will work also with JDK 1.7 and JDK 1.8. Regarding the source version (syntax), some source versions can be compiled to older bytecode, while some others can not。如果您想 运行 将您的代码放在比您用于开发的旧的 JVM 上,这可能很重要。
这就是为什么您可能不对用于编译源文件的 JDK 版本感兴趣,而是对生成的字节码版本感兴趣。正如我在评论中建议的那样,以十六进制 viewer/editor 打开一个 .class
文件并引用 Java class file - General layout 以找出版本。
UPDATE:顺便说一下,JVM 字节码不必由 Java 编译器创建。除了 Java 之外,还有其他 JVM 语言,但它们的编译器仍会生成可以在 JVM 上 运行 的字节码。在这种情况下,谈论 Java.
的版本是没有意义的
我有一个使用 maven 编译成 ear 文件的项目。这是用于编译代码的内容:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<source>1.6/source>
<target>1.6</target>
</configuration>
</plugin>
有没有办法确定用于编译代码的 Java maven 的次要版本?
更新:
通过执行以下操作,我可以仅使用从 maven 构建生成的 ear 文件来获取主要版本和次要版本:
- 使用 zip 文件工具提取 ear 文件以获取包含的文件
- 从提取的文件中找到从我的源代码生成的 jar 文件之一
- 运行 javap 使用以下内容(来自 jar 文件所在的目录):
javap -classpath ./myjarfile.jar -verbose -c com.myorg.myproj.MyClass
输出的开头如下所示:
Classfile jar:file:/C:/TEMP/myjarfile.jar!/com/myorg/myproject/MyClass.class
Last modified May 26, 2017; size 944 bytes
MD5 checksum 37996ea9840df04afb5485fedd861f8e
Compiled from "MyClass.java"
public class com.myorg.myproj.MyClass extends com.myorg.myproj.SomeOtherClass
SourceFile: "SomeOtherClass.java"
minor version: 0
major version: 50
flags: ACC_PUBLIC, ACC_SUPER
看来我的 class 是使用主要版本 50 和次要版本 0 编译的。
但是,问题仍然存在,Java 的哪个特定版本用于编译代码?如果您在 cmd 提示符下键入 "java -version"(例如 java 版本“1.7.0_51”),我希望得到类似的结果。
就 "java -version" 版本而言,50.0 映射到什么?
关于这种类型的映射有很多帖子,但它们似乎都只映射主要版本。其中包括:
List of Java class file format major version numbers?
https://blogs.oracle.com/darcy/source%2c-target%2c-class-file-version-decoder-ring
http://www.rgagnon.com/javadetails/java-0544.html
另外,我编译代码的机器上好像没有安装Java1.6的环境,所以不清楚maven是用什么编译代码的Java 1`.6。
您确实不需要 特定 版本的 JDK。但是,如果您这样做,请使用 Maven 帮助站点上显示的 XML 片段:
<configuration>
<verbose>true</verbose>
<fork>true</fork>
<executable><!-- path-to-javac --></executable>
<compilerVersion>1.3</compilerVersion>
</configuration>
您通往 JavaC 的路径如下所示:C:\Program Files\Java\j2sdk1.4.2_09\bin\javac
。当然,您必须找到您的实际 Java JDK 位置。
当您使用 Maven 编译 Java 类 时,有多个角色在起作用,因此您应该了解您感兴趣的 版本。
- Maven 和 maven-compile-plugin
- 它又使用 plexus-compiler - 编译器适配器
- Java 编译器 -
javax.tools.JavaCompiler
called from the plugin, thejavac
command, or another compiler 实现取决于 Maven 的配置
- 生成的 JVM 字节码
如果没有使用自定义配置,Maven 编译器插件需要一个 Java 编译器到 运行,如果您没有 JDK(仅 JRE),将会失败机器。如果您 运行 mvn
命令和 -X
(例如 mvn -version -X
),它将打印有关它使用的 Java 安装的详细信息。在大多数情况下,将使用来自该安装的编译器。请注意 Java home
指向 JRE,但它是 JDK 的一部分。您可以通过 运行 使用 -X
.
Apache Maven 3.3.9
Maven home: /usr/share/maven
Java version: 1.8.0_131, vendor: Oracle Corporation
Java home: /usr/lib/jvm/java-8-openjdk-amd64/jre
Maven 通过在工件的清单 (META-INF/MANIFEST.MF
) 中包含构建 JDK 版本,让我们的生活变得更加轻松。
Created-By: Apache Maven 3.3.9
Build-Jdk: 1.8.0_121
源和目标版本
为了生成 1.6 字节码,Java 编译器不必是同一版本。这叫做"cross-compilation". So, your configuration will work also with JDK 1.7 and JDK 1.8. Regarding the source version (syntax), some source versions can be compiled to older bytecode, while some others can not。如果您想 运行 将您的代码放在比您用于开发的旧的 JVM 上,这可能很重要。
这就是为什么您可能不对用于编译源文件的 JDK 版本感兴趣,而是对生成的字节码版本感兴趣。正如我在评论中建议的那样,以十六进制 viewer/editor 打开一个 .class
文件并引用 Java class file - General layout 以找出版本。
UPDATE:顺便说一下,JVM 字节码不必由 Java 编译器创建。除了 Java 之外,还有其他 JVM 语言,但它们的编译器仍会生成可以在 JVM 上 运行 的字节码。在这种情况下,谈论 Java.
的版本是没有意义的