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.Optional
或 java8
中引入的方法,则一切正常像 Collection.forEach
)。如果有这样的用法然后构建通过,但它在运行时失败,当 运行 在 JVM 下 Java 8.
问题:
我的目标是在存在此类依赖项的情况下使构建失败。有没有办法在构建时检测对 new Java 8
classes/methods 的依赖?
我考虑了 2 个可能的选项,但不确定其中一个是否可行:
- 某种字节码分析器,用于检测预定义 类 和方法的依赖关系。有这样的tools/maven插件吗?
- Lint (
lint4j
) 规则。不确定是否可以使用 lint
检测对 class/method 的依赖
您可以为此使用 Animal Sniffer Maven Plugin。它允许您检查您的代码是否仅使用来自指定基线(称为 "signature")的 API。在您的情况下,您将使用 org.codehaus.mojo.signature:java17:1.0 签名。
正如其他人指出的那样,您也可以设置 bootstrap 类路径,但是 a) 需要设置 JDK 7 并且 b) 使构建有点复杂,因为您需要指向 JDK 7 安装。根据我的经验,Animal Sniffer 更容易使用。
背景:
我们有基于 maven
的 java 项目,目标是 JRE 1.7,但源代码使用 lambda,所以我们使用 retrolambda
来转换 Java 8
源代码至 Java 7
。当我们需要流、函数*、可选等时,我们也使用 StreamSupport 向后移植库
retrolambda
的使用涉及将项目的源语言和目标语言级别配置为 1.8。
如果不依赖 java8 类 或方法(如 java.util.stream.*
、java.util.Optional
或 java8
中引入的方法,则一切正常像 Collection.forEach
)。如果有这样的用法然后构建通过,但它在运行时失败,当 运行 在 JVM 下 Java 8.
问题:
我的目标是在存在此类依赖项的情况下使构建失败。有没有办法在构建时检测对 new Java 8
classes/methods 的依赖?
我考虑了 2 个可能的选项,但不确定其中一个是否可行:
- 某种字节码分析器,用于检测预定义 类 和方法的依赖关系。有这样的tools/maven插件吗?
- Lint (
lint4j
) 规则。不确定是否可以使用lint
检测对 class/method 的依赖
您可以为此使用 Animal Sniffer Maven Plugin。它允许您检查您的代码是否仅使用来自指定基线(称为 "signature")的 API。在您的情况下,您将使用 org.codehaus.mojo.signature:java17:1.0 签名。
正如其他人指出的那样,您也可以设置 bootstrap 类路径,但是 a) 需要设置 JDK 7 并且 b) 使构建有点复杂,因为您需要指向 JDK 7 安装。根据我的经验,Animal Sniffer 更容易使用。