簡體   English   中英

需要 Maven 依賴的 Java 版本?

[英]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 版本編譯的。

我的問題:

  1. 這可能嗎? 我認為 Maven 會解決這種依賴版本問題。

  2. 有沒有一種簡單的方法可以找出我所有依賴項的次要/主要版本? (如果它可以在執行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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM