【问题标题】:How to list the JDK compatibility (like "sourceCompatibility") of all of the dependencies with a gradle project?如何列出 gradle 项目的所有依赖项的 JDK 兼容性(如“sourceCompatibility”)?
【发布时间】:2016-03-25 23:44:17
【问题描述】:

我需要知道我在我的 gradle 项目中使用的所有依赖项的 Java 运行时兼容性(就好像它正在检查每个项目的“sourceCompatibility”设置一样),最好不要仔细阅读每个依赖项的文档来找到它,如果它在那里。有没有办法用gradle做到这一点?甚至是其他一些自动化工具?

(具体来说,我正在尝试查看哪些依赖项可能正在使用 Java 8 功能,例如 Streams,因为我正在尝试使用 retrolambda 为 Android 编译,以及使用 RoboVM 为 iOS 编译。)

【问题讨论】:

    标签: java gradle dependencies


    【解决方案1】:

    这样的信息可能不存在,而且生成起来非常繁琐。

    "sourceCompatibility" 源编译后不存在--它只是告诉编译器如何解释源语法。您更可能感兴趣的是“targetCompatibility”,或者类文件格式的主要版本:Java 8 是 52,Java 7 是 51,等等。

    这告诉 Java 需要 Java 8 才能理解类中包含的类格式和字节码,因此您可以下载并解压项目中的每个依赖项及其所有依赖项,然后查看每个类文件的版本号,除了...

    仅查看类文件格式版本并不能告诉您该类是否引用了仅存在于特定 JDK 版本中的方法和字段。我没有使用 Java 8 进行测试,但在 Java 7 中,可以将源/目标兼容性设置为 1.6,并且仍然引用 Java 7 中添加的新方法。Java 6 JVM 将加载并运行该文件,但会失败NoSuchMethodException 尽管其他方面看起来都很好。


    真正检查依赖项是否与编译它的版本不同的 Java 版本完全兼容的唯一方法是遍历每个类的常量池,找到每个类和方法引用,然后验证它们对所需的 JRE 有效。

    您将需要一个自动化工具(如果您安装了所需的 Java 版本并且在单元测试中 100% 覆盖率,JVM 可以做到这一点...),但我不知道有一个独立工具可以确实如此,而且 gradle 和项目文档通常都不包含此类信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-20
      • 2021-12-26
      • 1970-01-01
      • 2019-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多