java - 有没有办法在依赖项中强制执行编译器目标版本?

标签 java maven java-8

在 Maven 中配置目标确保库代码将在以前的编译器版本中运行,但如果它的依赖项是 future 版本,则它不能防止在使用它运行库时失败。

例如,假设我的 JDK 是 Java8 编译器,如果我的代码使用 Optionals,它将通过目标 1.7,但运行时会失败,因为它是 1.8 中引入的类,作为 java 内部依赖项提供。

是否有任何机制可以确保整个库符合 1.7 并因此在编译时启动 Optionals?

最佳答案

首先定义 target/source 并不能保证您的代码可以使用其他 JVM 版本而不是您用来编译的版本(这不太可能但会发生)。唯一的解决方案是使用 maven toolchains假定您安装了适当的 JDK 并使用正确的 JDK 进行编译。

此外,对于您的库问题,您可以使用 animal-sniffer-maven-plugin它还将根据 JDK 签名文件检查库...

<project>
  ...
  <build>
    ...
    <plugins>
      ...
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>animal-sniffer-maven-plugin</artifactId>
        <version>1.15</version>
        ...
        <configuration>
          ...
          <signature>
            <groupId>org.codehaus.mojo.signature</groupId>
            <artifactId>java17</artifactId>
            <version>1.0</version>
          </signature>
          ...
        </configuration>
        ...
      </plugin>
      ...
    </plugins>
    ...
  </build>
  ...
</project>

因此,如果您在构建时运行它,将根据 JDK 签名文件检查您使用的所有库。

要同时检查字节码,您可以使用 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>
        <executions>
          <execution>
            <id>enforce-bytecode-version</id>
            <goals>
              <goal>enforce</goal>
            </goals>
            <configuration>
              <rules>
                <enforceBytecodeVersion>
                  <maxJdkVersion>1.7</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-4</version>
          </dependency>
        </dependencies>
      </plugin>
    </plugins>
  </build>
  [...]
</project>

关于java - 有没有办法在依赖项中强制执行编译器目标版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38306596/

相关文章:

java - 在注释处理器中使用 ServiceLoader

java - 带有 Informix JDBC 3 驱动程序的 Hibernate 4.3

java - 使java项目与maven集成

java - 如何让 bazel 依赖于 Oracle JDK 而不是 OpenJDK?

java - FacebookSdk 尝试在空对象引用上调用虚拟方法 'android.view.View android.view.View.findViewById(int)'

java - Spring mvc 发现不明确的映射。无法映射 Controller bean 方法

javascript - 调试代码时不要缩小 js minify-maven-plugin samaxes

maven - 如何在共享 jenkins 服务器上管理 maven settings.xml?

java - Supply接口(interface)中的get()在哪里实现?

java - 如何使用 DateTimeFormatter 解析带冒号的偏移量?