需要Maven Dependency的Java版本吗?

ddrv8njm  于 2023-06-21  发布在  Maven
关注(0)|答案(2)|浏览(168)

我使用Maven开发和构建了我的Java应用程序。我需要支持Java 1.6,所以我使用以下属性:

<maven.compiler.target>1.6</maven.compiler.target>
<maven.compiler.source>1.6</maven.compiler.source>

尽管如此,当我运行应用程序时,我得到了一个“不支持的主要.次要版本”错误,我怀疑我的一个依赖项jar编译的Java版本比我需要支持的版本新。

我的问题:

1.这可能吗我以为Maven会处理这种依赖版本问题。
1.有没有一种简单的方法可以找出我所有依赖项的次要/主要版本?(如果在执行mvn dependency:tree时可以显示它,那就太棒了。

exdqitrt

exdqitrt1#

问题是每个依赖项(维护者)都可以自己决定使用哪个Java版本来编译(1.5,1.6,1.7,1.8等),所以这是无法通过Maven解决的。但是你可以确保你没有使用依赖项,这些依赖项使用的Java版本与你想要的不同。
这可以通过使用Maven Enforcer Plugin通过使用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编译的,这将破坏你的构建。

noj0wjuj

noj0wjuj2#

回答你的两个问题:
是的,这是可能的。查看docs<maven.compiler.target><maven.compiler.source>属性只是告诉Maven使用哪个版本的javac来编译您的项目。我引用一下,供你参考:
注意:仅仅设置 target 选项并不能保证您的代码实际上在具有指定版本的JRE上运行。陷阱是无意中使用了只存在于后来的JRE中的API,这将使您的代码在运行时因链接错误而失败。要避免此问题,您可以配置编译器的 Boot 类路径以匹配目标JRE,或者使用Animal Sniffer Maven插件来验证您的代码没有使用非预期的API。
Unsupported major.minor version错误后面的幻数实际上告诉类文件兼容的JRE版本:

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 plugin是否有助于嗅出依赖项的主要/次要版本。

相关问题