【发布时间】: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