gpt4 book ai didi

java - maven 将我的项目编译为 Java 的哪个主要版本和次要版本?

转载 作者:行者123 更新时间:2023-11-30 06:39:54 26 4
gpt4 key购买 nike

我有一个使用 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

看来我的类是使用主要版本 50 和次要版本 0 编译的。

但是,问题仍然存在,使用什么特定版本的 Java 来编译代码?我期待类似如果您在 cmd 提示符下键入“java -version”(例如 java 版本“1.7.0_51”)会得到的结果。

50.0 在“java -version”版本方面映射到什么?

有很多关于这种类型的映射的帖子,但它们似乎都只映射主要版本。其中包括以下内容:

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

另外,我编译代码的机器上似乎没有安装Java 1.6环境,所以我不确定使用什么maven将代码编译为Java 1`.6。

最佳答案

当您使用 Maven 编译 Java 类时,有多个角色在起作用,因此您应该了解您感兴趣的内容的版本。

如果不使用自定义配置,Maven 编译器插件需要 Java 编译器才能运行,如果您的计算机上没有 JDK(仅 JRE),则会失败。如果您使用 -X 运行 mvn 命令(例如 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 通过将构建 JDK 版本包含在 Artifact 的 list (META-INF/MANIFEST.MF) 中,使我们的生活变得更加轻松。

Created-By: Apache Maven 3.3.9
Build-Jdk: 1.8.0_121

源版本和目标版本

为了生成 1.6 字节码,Java 编译器不必具有相同的版本。这称为"cross-compilation" 。因此,您的配置也适用于 JDK 1.7 和 JDK 1.8。关于源版本(语法),某些源版本可以编译为较旧的字节码,而其他一些 can not 。如果您想在比您用于开发的 JVM 更旧的 JVM 上运行代码,这一点可能很重要。

这就是为什么您可能对用于编译源文件的 JDK 版本不感兴趣,而是对生成的字节码版本感兴趣。正如我在评论中建议的那样,在十六进制查看器/编辑器中打开 .class 文件并引用 Java class file - General layout找出版本。

更新:顺便说一句,JVM 字节码不必由 Java 编译器创建。除了 Java 之外,还有 JVM 语言,但它们的编译器仍然生成可以在 JVM 上运行的字节码。在这种情况下谈论 Java 的版本是没有意义的。

关于java - maven 将我的项目编译为 Java 的哪个主要版本和次要版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44548702/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com