【发布时间】:2016-12-20 09:24:50
【问题描述】:
我正在更新大量遗留 Java 应用程序。当前构建使用 ant,其依赖项来自每个项目的 lib 目录。依赖项是每个项目的一部分,并已签入源代码控制。更新的目的是将构建转换为 gradle 并使用 maven 存储库进行依赖管理。为简单起见,旧版本使用 ant 构造从其他项目的 lib 目录复制依赖项,例如:
<fileset dir="../anotherlegacyproject/lib">
<include name="**/*.jar" />
</fileset>
此方法用于编译和运行时依赖项。虽然这可行,但它会导致部署工件膨胀,因为其中包含许多在运行时不需要的 jar。例如,许多项目在 runtime 中包含 junit、hamcrest 和 jaxb-xjc,即使它们仅用于 compile 或 test .大多数项目都创建一个 zip 文件和一个包含可部署应用程序的 RPM。我想仅在 RPM 中包含所需的运行时依赖项。
我正在尝试确定一种可靠的方法来识别这些未使用的运行时依赖项。
我已经查看了帖子:How to find\remove unused dependencies in gradle,但这并没有解决未使用的运行时依赖项。我曾尝试使用以下 gradle 插件,但没有一个能识别未使用的运行时依赖项:
- github.com/nebula-plugins/gradle-lint-plugin
- github.com/wfhartford/gradle-dependency-analyze
- docs.gradle.org/current/userguide/jdepend_plugin.html
我愿意接受任何可靠的解决方案,但我的偏好是这样的:
- 现有的 gradle 插件
- 可以合并到 build.gradle 文件中的代码或打包为插件的 groovy 代码
- 其他的
【问题讨论】:
-
这是一个有点复杂的问题——如果你的代码执行运行时反射怎么办?即使是静态分析也无济于事。
-
但老实说,一个充满 Jars 的源代码控制的 lib 目录还是很恶心。如果您冒险尝试并用 Maven 依赖项替换它们,那么您的情况会好得多。 (这样做所涉及的工作将使您当前的问题变得毫无意义。)
-
毫无意义,因为无论如何您都必须一个接一个地评估每个 Jar(以便找出其等效的 Maven 坐标)。确定
compile或testCompile是否需要它并不需要花费更多的精力。 -
我已经完成了确定maven坐标的所有工作。我使用与旧项目相同的所有依赖项在 gradle 中复制了旧 RPM。我要解决的问题是运行时,而不是编译或 testCompile。 junit 参考只是一个例子。更现实的例子是 org.elasticsearch:elasticsearch:2.3.2,它有 37 个依赖项,其中只有 5 个是测试的。如果在运行时不使用其他 32 个依赖项,我不想继续包含它们。
-
好的,我认为这与我最初的评论基本相似 - 这感觉不像是可以通过静态方式实现的。
标签: java maven gradle dependencies