我使用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
时可以显示它,那就太棒了。
2条答案
按热度按时间exdqitrt1#
问题是每个依赖项(维护者)都可以自己决定使用哪个Java版本来编译(1.5,1.6,1.7,1.8等),所以这是无法通过Maven解决的。但是你可以确保你没有使用依赖项,这些依赖项使用的Java版本与你想要的不同。
这可以通过使用Maven Enforcer Plugin通过使用extra-enforcer-rules来实现:
如果你有一个依赖项,它是用一个与你想要的版本不同的JDK编译的,这将破坏你的构建。
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版本:我不知道是否有一个简单的方法来告诉一个项目中所有依赖项(和传递依赖项)的主要/次要版本。
更新:虽然我以前没有使用过它,但我想知道Animal Sniffer Maven plugin是否有助于嗅出依赖项的主要/次要版本。