什么主要和次要版本的Java maven编译我的项目?

时间:2017-06-14 15:18:20

标签: java maven version

我有一个使用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文件来获取主要版本和次要版本:

  • 使用zip文件工具提取ear文件以获取包含的文件
  • 从提取的文件中找到从我的源代码
  • 生成的其中一个罐子
  • 使用以下命令运行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

所以看起来我的课程是使用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。

2 个答案:

答案 0 :(得分:1)

当你使用Maven编译Java类时,有几个演员在玩,所以你应该理解你感兴趣的 版本。

如果没有使用自定义配置,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位置。