【问题标题】:Safe removal of "unused" runtime dependencies安全删除“未使用”的运行时依赖项
【发布时间】:2017-03-16 09:35:32
【问题描述】:

我有一个由 Maven 管理的 Java 项目部署到 Glassfish。

我的问题是,如何安全地删除可能是运行时依赖项的 maven 管理的依赖项?

我使用maven dependency plugin 来识别遗留项目上未使用的依赖项:

mvn dependency:analyze -DignoreNonCompile=true

输出如下:

[INFO] --- maven-dependency-plugin:2.8:analyze (default-cli) @ MyProject ---
[WARNING] Used undeclared dependencies found:
[WARNING]    commons-collections:commons-collections:jar:3.2:compile
[WARNING]    commons-beanutils:commons-beanutils:jar:1.7.0:compile
[WARNING]    org.apache.cxf:cxf-core:jar:3.1.3:compile
[WARNING]    junit:junit:jar:4.11:test
[WARNING]    org.springframework:spring-test:jar:4.1.6.RELEASE:test
[WARNING]    com.fasterxml.jackson.core:jackson-databind:jar:2.4.3:compile
[WARNING]    ca.uhn.hapi:hapi-base:jar:2.2:compile
[WARNING]    org.apache.camel:camel-core:jar:2.15.3:compile
[WARNING] Unused declared dependencies found:
[WARNING]    org.apache.camel:camel-cxf:jar:2.15.3:compile
[WARNING]    org.apache.cxf:cxf-rt-bindings-soap:jar:3.1.3:compile
[WARNING]    org.apache.camel:camel-jms:jar:2.15.3:compile
[WARNING]    net.sf.saxon:Saxon-HE:jar:9.5.1-5:compile
[WARNING]    org.apache.camel:camel-mina2:jar:2.15.3:compile
[WARNING]    com.google.code.gson:gson:jar:2.7:compile
[WARNING]    org.springframework:spring-jms:jar:4.2.1.RELEASE:compile
[WARNING]    org.springframework:spring-web:jar:4.2.1.RELEASE:compile
[WARNING]    org.springframework:spring-orm:jar:4.2.1.RELEASE:compile
[WARNING]    org.apache.cxf:cxf-rt-frontend-jaxws:jar:3.1.3:compile
[WARNING]    org.apache.camel:camel-spring-ws:jar:2.15.3:compile
[WARNING]    org.apache.camel:camel-saxon:jar:2.15.3:compile
[WARNING]    org.apache.camel:camel-servlet:jar:2.15.3:compile
[WARNING]    org.apache.camel:camel-hl7:jar:2.15.3:compile
[WARNING]    org.apache.camel:camel-spring:jar:2.15.3:compile
[WARNING]    org.apache.camel:camel-ftp:jar:2.15.3:compile
[WARNING]    org.apache.camel:camel-velocity:jar:2.15.3:compile
[WARNING]    ch.qos.logback:logback-classic:jar:1.1.2:compile
[WARNING]    org.apache.cxf:cxf-rt-transports-http:jar:3.1.3:compile
[WARNING]    org.apache.camel:camel-ejb:jar:2.15.3:compile
[WARNING]    org.slf4j:slf4j-api:jar:1.7.7:compile

我想删除这些“未使用”的依赖项,但我担心应用程序在运行时会失败。

我启用的ignoreNonCompile 选项承诺“忽略运行时/提供/测试/系统范围以进行未使用的依赖项分析”,但据我所知,设置依赖项的范围是开发人员所做的事情(它不是自动发生),所以我认为我不能确定这些“未使用”的依赖项实际上不是运行时依赖项。

我特别标记这个问题apache-camel的原因是因为我担心maven依赖插件特别有可能因为Camel DSL而错误识别“未使用”的Camel依赖。例如,camel-ftp 组件由如下所示的 DSL 使用:

from("ftp://foo@myserver?password=secret&ftpClient.dataTimeout=30000").to("bean:foo");

我认为就 Maven 而言这只是一个字符串,所以它可能没有意识到该项目对camel-ftp 组件有真正的依赖。

我的问题是,如何安全地删除可能是运行时依赖项的依赖项?

【问题讨论】:

  • 使用像 ProGuard 这样的系统来分析字节码级别的依赖关系并丢弃未使用的类
  • 感谢您的想法,@SeanPatrickFloyd:这是一个好主意! ProGuard 需要一些时间来学习和配置,尤其是对于一个大项目。我不害怕这项工作,但即使是之后,我仍然想清理我的 pom.xml 文件:我不想首先包含未使用的依赖项。
  • 我明白,但那部分要困难得多。也许您可以仅使用 ProGuard 进行分析,并使用输出来检测您需要保留哪些依赖项?

标签: java maven apache-camel


【解决方案1】:

Camel 是动态实例化类并使用接口,而不是像camel-ftp 这样的具体类。在这种情况下,字节码工具在分析依赖关系方面是没有用的。

解决方案是拥有一套全面的单元测试,涵盖您的快乐路径和错误路径场景,并针对一组精简的已声明 Maven 依赖项进行测试。

如果您真的想修剪依赖关系,请尽量避免使用 *-spring 组件并使用蓝图或 Java DSL。 Spring 组件往往有很多传递依赖。

【讨论】:

  • 谢谢马特!所以dependency:analyze 可能会返回很多关于 Camel 的误报,而 ProGuard 不太可能做得更好,因为它也是一个字节码工具。我希望我有一个全面的单元测试套件,但我无法添加一个。我想我会把我的重构注意力转移到其他地方。
猜你喜欢
  • 2012-08-17
  • 1970-01-01
  • 1970-01-01
  • 2015-10-20
  • 2015-05-07
  • 2020-12-07
  • 2023-02-11
  • 2016-12-20
  • 1970-01-01
相关资源
最近更新 更多