我使用Maven开发并构建了我的Java应用程序。我需要支持Java 1.6,所以我使用以下属性:
<maven.compiler.target>1.6</maven.compiler.target>
<maven.compiler.source>1.6</maven.compiler.source>
但是,当我运行应用程序时,我得到一个&#34;不支持的major.minor版本&#34;错误,我怀疑我的一个依赖jar是使用比我需要支持的Java版本更新的Java版本编译的。
我的问题:
这甚至可能吗?我以为Maven会处理这种依赖版本的问题。
有没有一种简单的方法可以找出所有依赖项的次要/主要版本? (如果在执行mvn dependency:tree
时可以显示它会很棒。)
答案 0 :(得分:19)
问题在于每个依赖项(维护者)都可以决定它自己使用哪个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编译的依赖项,那么这将破坏你的构建。
答案 1 :(得分:0)
回答你的两个问题:
是的,这是可能的。查看docs
,<maven.compiler.target>
和<maven.compiler.source>
属性只是告诉Maven使用哪个javac
版本来编译您的项目。我引用,供你参考:
注意:仅设置目标选项并不保证您的 代码实际上在具有指定版本的JRE上运行。陷阱是 无意中使用的API只存在于以后的JRE中 使用链接错误使代码在运行时失败。为了避免这种情况 问题,您可以配置编译器的引导类路径以匹配 目标JRE或使用Animal Sniffer Maven插件来验证您的 代码不使用非预期的API。
Unsupported major.minor version
错误之后的magic number实际上告诉了类文件兼容的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将有助于嗅出依赖项的主要/次要版本。