Maven依赖的必需Java版本?

时间:2014-10-25 06:17:30

标签: java maven

我使用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版本编译的。

我的问题:

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

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

2 个答案:

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