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

时间:2016-11-03 13:42:36

标签: java maven java-8 lint retrolambda

背景

我们有基于maven的java项目,它以JRE 1.7为目标,但源代码使用lambdas,因此我们使用retrolambdaJava 8源代码转换为Java 7 。当我们需要流,函数。*,可选等等时,我们也使用StreamSupport backport库。

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

如果对java8类或方法(如java.util.stream.*java.util.Optionaljava8中引入的方法(如Collection.forEach)没有依赖关系,那么一切正常。如果有这样的用法然后构建传递,但它在运行时失败,当在Java 8的JVM下运行时。

问题:

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

我想到了两种可能的选择,但我不确定它们中的任何一种是否可行:

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

1 个答案:

答案 0 :(得分:5)

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

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