Apache Maven JDeps 插件 3.0.0 版本发布

  • Abraham Marín Pérez
  • 丛一

2015 年 11 月 29 日

话题:Java持续集成DevOps语言 & 开发架构

一个全新的 maven 插件刚刚发布,可利用 jdeps 实用程序查找 JDK 内部 API 的使用情况。当该插件被激活时,在代码中如果发现任何内部 API 的调用都会导致 maven 构建失败。从 Java 9 开始,内部 API 将变为不可访问,因此这个插件可以帮助开发者让他们的代码与下一版本的 Java 兼容。尽管标注为 3.0.0,实际上这是该插件的第一个发布版本。

正如在其项目主页中所描述的,该插件为用户提供两个可用的目标:jdkinternals 和 test-jdkinternals。前一个目标会检查主代码中是否包含对内部 API 的引用,而后一个则对测试代码做同样的检查;jdkinternals 默认情况下会与 maven 的 process-classes 阶段(在编译后立即执行)相关联,而 test-jdkinternals 则会与 process-test-classes 阶段相关联(在测试代码编译后立即执行)。默认的配置可以引用该插件并以如下方式同时激活两个目标:

<build>
    <plugins>
        <plugin>
            <groupid>org.apache.maven.plugins</groupid>
            <artifactid>maven-jdeps-plugin</artifactid>
            <version>3.0.0</version>
            <executions>
                <execution>
                    <goals>
                       <goal>jdkinternals</goal>
                       <goal>test-jdkinternals</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <!— Other plugins —>
    </plugins>
</build>

举例来说,假设一个项目使用了内部类sun.misc.BASE64Decoder。当该项目配置使用了 JDeps 插件,maven 会构建失败并提示如下原因:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-jdeps-plugin:3.0.0:jdkinternals (default) on project : Found offending packages:
[ERROR] sun.misc -> JDK internal API (rt.jar)
[ERROR] -> [Help 1]

作为其中一部分输出,对于项目中的每个包,maven 还会列示出所有引用了该段代码的包,以及该包的源码。作为上个示例输出的一部分,我们会发现如下包中使用了 BASE64Decoder:

package.name (classes)
      [... other packages ...]
      -> sun.misc                                           JDK internal API (rt.jar)

这能够帮助开发人员定位出现问题的地方。不过有另外一种方法能够获取到更多细节。 如之前所述,这个插件基于由 Oracle 提供的,作为 JDK 8 一部分的jdeps工具包。如果插件由于查找到对内部 API 的引用,强制构建失败,用户就可以使用 jdeps 尝试找出与导致问题的 API 相关的更多信息;有时,如果有非内部 API 可替换,jdeps 甚至可以为用户指出该非内部 API。继续上面提到的 BASE64Decoder 的例子,运行带有合适选项的 jdeps 将会得出如下结果:

jdeps -jdkinternals target/classes/*  

[...]

JDK Internal API                         Suggested Replacement
----------------                         ---------------------
sun.misc.BASE64Decoder                   Use java.util.Base64 @since 1.8

不过,如果某个内部 API 还不存在可替代品,就像sun.misc.Unsafe,这个插件有可能会阻断开发。由于这个缘故,该插件对于那些目前尚未使用任何内部 API 并且希望确保将来也不会使用它们的用户来说最为实用。Martijn Verburg,jClarity 的联合创始人,自 2012 年以来的 Java 冠军程序员,在最近的一次交流当中,鼓励所有的开发者使用 Apache Maven JDeps 插件,以减少将来向 Java 9 迁移所需投入的精力。

查看英文原文:Apache Maven JDeps Plugin 3.0.0 Released

Java持续集成DevOps语言 & 开发架构