Maven依赖的必需Java版本?

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

1.6 1.6 

但是,当我运行应用程序时,我得到一个“不支持的major.minor版本”错误,我怀疑我的一个依赖项jar是使用比我需要支持的Java版本更新的Java版本编译的。

我的问题:

  1. 这有可能吗? 我以为Maven会处理这种依赖版本的问题。

  2. 有没有一种简单的方法可以找出所有依赖项的次要/主要版本? (如果在执行mvn dependency:tree时可以显示它会很棒mvn dependency:tree例如mvn dependency:tree 。)

问题是每个依赖项(维护者)都可以决定它自己使用哪个java版本进行编译(1.5,1.6,1.7,1.8等),所以这不能通过Maven解决。 但是,您可以确保不使用使用不同Java版本的依赖项。

这可以通过使用额外的执行器规则使用Maven Enforcer插件来实现:

  [...]    org.apache.maven.plugins maven-enforcer-plugin 1.4.1    enforce-bytecode-version  enforce     1.6  org.mindrot:jbcrypt    true      org.codehaus.mojo extra-enforcer-rules 1.0-beta-5      [...]  

如果你有一个使用不同版本的JDK编译的依赖项,那么这将破坏你的构建。

回答你的两个问题:

是的,这是可能的。 查看docs属性只是告诉Maven使用哪个版本的javac来编译项目。 我引用,供你参考:

注意:仅设置目标选项并不能保证您的代码实际上在具有指定版本的JRE上运行。 缺点是无意中使用的API只存在于以后的JRE中,这会使您的代码在运行时因链接错误而失败。 要避免此问题,可以配置编译器的引导类路径以匹配目标JRE,也可以使用Animal Sniffer Maven插件validation代码是否使用非预期的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插件将有助于嗅出你的依赖项的主要/次要版本。