Maven/Retrolambda:如何检测对 Java 8 类 的依赖

Maven/Retrolambda: how to detect dependencies on Java 8 classes

背景:

我们有基于 maven 的 java 项目,目标是 JRE 1.7,但源代码使用 lambda,所以我们使用 retrolambda 来转换 Java 8 源代码至 Java 7。当我们需要流、函数*、可选等时,我们也使用 StreamSupport 向后移植库

retrolambda 的使用涉及将项目的源语言和目标语言级别配置为 1.8。

如果不依赖 java8 类 或方法(如 java.util.stream.*java.util.Optionaljava8 中引入的方法,则一切正常像 Collection.forEach)。如果有这样的用法然后构建通过,但它在运行时失败,当 运行 在 JVM 下 Java 8.

问题:

我的目标是在存在此类依赖项的情况下使构建失败。有没有办法在构建时检测对 new Java 8 classes/methods 的依赖?

我考虑了 2 个可能的选项,但不确定其中一个是否可行:

  1. 某种字节码分析器,用于检测预定义 类 和方法的依赖关系。有这样的tools/maven插件吗?
  2. Lint (lint4j) 规则。不确定是否可以使用 lint
  3. 检测对 class/method 的依赖

您可以为此使用 Animal Sniffer Maven Plugin。它允许您检查您的代码是否仅使用来自指定基线(称为 "signature")的 API。在您的情况下,您将使用 org.codehaus.mojo.signature:java17:1.0 签名。

正如其他人指出的那样,您也可以设置 bootstrap 类路径,但是 a) 需要设置 JDK 7 并且 b) 使构建有点复杂,因为您需要指向 JDK 7 安装。根据我的经验,Animal Sniffer 更容易使用。