我使用Maven开发和构建了Java应用程序。我需要支持Java 1.6,因此我使用以下属性:
<maven.compiler.target>1.6</maven.compiler.target> <maven.compiler.source>1.6</maven.compiler.source>
尽管如此,当我运行该应用程序时,仍然出现“不受支持的major.minor版本”错误,并且我怀疑我的一个依赖罐是使用比我需要支持的Java版本更新的Java版本进行编译的。
我的问题:
这有可能吗?我以为Maven会解决这种依赖版本问题。
有没有一种简单的方法来找出我所有依赖项的次要/主要版本?(mvn dependency:tree例如,如果可以在执行时显示它,那将是很棒的。)
mvn dependency:tree
问题在于每个依赖项(维护者)都可以自行决定使用哪个Java版本(1.5、1.6、1.7、1.8等)进行编译,因此无法通过Maven解决。但是您可以确保不使用依赖于您所不希望使用的Java版本的依赖项。
可以通过使用extra-enforcer-rules使用Maven Enforcer插件来实现:
<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编译的,则这将破坏您的构建。