我有一个由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组件。
我的问题是,如何安全地删除可能是运行时依赖项的依赖项?
答案 0 :(得分:1)
Camel是动态实例化类和使用接口,而不是像camel-ftp这样的具体类。在这种情况下,字节代码工具在分析依赖关系时没有用处。
解决方案是拥有一套全面的单元测试,涵盖您的快乐路径和错误路径场景,并针对精简的Maven依赖集进行测试。
如果你真的想要修剪依赖关系,那么就要消除使用* -spring组件并使用蓝图或Java DSL。 Spring组件往往具有许多传递依赖性。