我有一个使用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构建生成的ear文件来获取主要版本和次要版本:
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
所以看起来我的课程是使用Major Version 50和Minor Version 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环境,所以我不确定用于将代码编译为Java 1`的maven。
答案 0 :(得分:1)
当你使用Maven编译Java类时,有几个演员在玩,所以你应该理解你感兴趣的 版本。
javax.tools.JavaCompiler
从插件调用,javac
命令或another compiler实现,具体取决于Maven的配置如果没有使用自定义配置,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
通过在工件的清单(META-INF/MANIFEST.MF
)中包含构建JDK版本,Maven使我们的生活更加轻松。
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上运行代码,这可能很重要。
这就是为什么您可能不会对用于编译源文件的JDK版本感兴趣,而是对结果字节码的版本感兴趣。正如我在评论中建议的那样,在十六进制查看器/编辑器中打开.class
文件并引用Java class file - General layout以查找版本。
UPDATE :顺便说一句,JVM字节码不必由Java编译器创建。除了Java之外,还有JVM语言,但是它们的编译器仍然生成可以在JVM上运行的字节码。在这种情况下,谈论Java版本是没有意义的。
答案 1 :(得分:0)
您真的不需要要求特定版本的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位置。