[英]Required Java version of Maven Dependency?
我使用 Maven 開發並構建了我的 Java 應用程序。我需要支持 Java 1.6,所以我使用以下屬性:
<maven.compiler.target>1.6</maven.compiler.target>
<maven.compiler.source>1.6</maven.compiler.source>
不過,當我運行該應用程序時,我收到“不支持的主要版本。次要版本”錯誤,並且我懷疑我的依賴項 jars 是使用比我需要支持的版本更新的 Java 版本編譯的。
我的問題:
這可能嗎? 我認為 Maven 會解決這種依賴版本問題。
有沒有一種簡單的方法可以找出我所有依賴項的次要/主要版本? (如果它可以在執行mvn dependency:tree
時顯示出來,那就太棒了。)
問題是每個依賴項(維護者)都可以自行決定使用哪個 java 版本進行編譯(1.5、1.6、1.7、1.8 等),因此這無法通過 Maven 解決。但是您可以確保不使用使用與您想要的不同的 Java 版本的依賴項。
這可以通過使用Maven Enforcer 插件使用extra-enforcer-rules來強制執行:
<project>
[...]
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>1.4.1</version> <!-- find the latest version at http://maven.apache.org/plugins/maven-enforcer-plugin/ -->
<executions>
<execution>
<id>enforce-bytecode-version</id>
<goals>
<goal>enforce</goal>
</goals>
<configuration>
<rules>
<enforceBytecodeVersion>
<maxJdkVersion>1.6</maxJdkVersion>
<excludes>
<exclude>org.mindrot:jbcrypt</exclude>
</excludes>
</enforceBytecodeVersion>
</rules>
<fail>true</fail>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.codehaus.mojo</groupId>
<artifactId>extra-enforcer-rules</artifactId>
<version>1.0-beta-5</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
[...]
</project>
如果您有一個依賴項是使用與您想要的不同版本的 JDK 編譯的,這將破壞您的構建。
回答你的兩個問題:
是的,這是可能的。 查看docs
, <maven.compiler.target>
和<maven.compiler.source>
屬性只是告訴 Maven 使用哪個版本的javac
來編譯您的項目。 我引用,供您參考:
注意:僅設置目標選項並不能保證您的代碼實際運行在具有指定版本的 JRE 上。 陷阱是 API 的意外使用,這些 API 僅存在於后來的 JRE 中,這會使您的代碼在運行時因鏈接錯誤而失敗。 為避免此問題,您可以配置編譯器的引導類路徑以匹配目標 JRE,或使用 Animal Sniffer Maven 插件來驗證您的代碼未使用意外的 API。
Unsupported major.minor version
錯誤后的幻數實際上告訴 JRE 的版本 class 文件兼容:
J2SE 8 = 52,
J2SE 7 = 51,
J2SE 6.0 = 50,
J2SE 5.0 = 49,
JDK 1.4 = 48,
JDK 1.3 = 47,
JDK 1.2 = 46,
JDK 1.1 = 45
我不知道是否有一種簡單的方法可以告訴項目中所有依賴項(和傳遞依賴項)的主要/次要版本。
更新:雖然我以前沒有使用過它,但我想知道Animal Sniffer Maven 插件是否有助於嗅探依賴項的主要/次要版本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.