安全删除"未使用的"运行时依赖

时间:2016-11-02 22:12:27

标签: java maven apache-camel

我有一个由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组件。

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

1 个答案:

答案 0 :(得分:1)

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

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

如果你真的想要修剪依赖关系,那么就要消除使用* -spring组件并使用蓝图或Java DSL。 Spring组件往往具有许多传递依赖性。