2017-06-14 58 views
1

我有一個使用maven編譯成ear文件的項目。這是用來編譯代碼:maven編譯我的項目的主要和次要版本的Java?

<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行傢什麼次要版本?

UPDATE:

我能得到只用做從Maven構建產生的耳朵文件的主要和次要版本如下:

  • 使用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 

所以它看起來像我的課編譯時使用主要版本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

另外,我似乎沒有安裝,我編譯的代碼的機器上的Java 1.6的環境,所以我m不確定maven用於將代碼編譯爲Java 1的特性。

+1

它使用默認情況下在系統上找到的任何JDK,或者如果來自IDE,則使用重寫的JDK。 (這是能夠編譯和運行1.6) – jr593

+1

正在使用JAVA_HOME的Maven打印。您可以運行java -version來查看確切的版本。 – vempo

+1

您也可以在十六進制版本中打開一個.class文件並查看https://en.wikipedia.org/wiki/Java_class_file#General_layout – vempo

回答

1

當您使用Maven編譯Java類時,有幾個演員正在播放,所以您應該瞭解的版本,您對此感興趣的是

如果沒有使用自定義配置,Maven編譯器插件需要Java編譯器才能運行,並且如果您的計算機上沒有JDK(僅JRE),將會失敗。如果使用-X(例如mvn -version -X)運行mvn命令,它將打印有關其使用的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"。因此,您的配置也可以在JDK 1.7和JDK 1.8上使用。關於源版本(語法),一些源版本可以被編譯爲較舊的字節碼,而另一些版本則可以被編譯爲can not。如果您想在比您用於開發時更早的JVM上運行代碼,這可能很重要。

這就是爲什麼你可能不感興趣的JDK版本用於編譯源文件,但在產生的字節碼的版本。正如我在評論中所建議的那樣,在十六進制查看器/編輯器中打開一個.class文件,並參考Java class file - General layout來查找版本。

UPDATE:順便說一下,JVM字節碼不必由Java編譯器創建。除了Java以外,還有JVM語言,但是它們的編譯器仍然生成可以在JVM上運行的字節碼。在這種情況下討論一個Java版本是毫無意義的。

0

您真的不需要要求特定的版本的JDK。如果你這樣做,但是,使用XML片段是在Maven的幫助網站顯示:

<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位置。

+0

這只是真相的一半導致bootclasspath不見了。如果你真的需要使用特定的JDK進行編譯,你必須使用[toolchains](https://maven.apache.org/guides/mini/guide-using-toolchains.html)...除此之外,如果你運行你的建立這個會運行你的測試與JDK Maven運行的版本..這不是你想要的... – khmarbaise

相關問題