Maven--优化依赖
Maven 会自动解析所有项目的直接依赖和传递依赖,并且根据规则正确判断每个依赖的范围,对于一些依赖冲突,也能进行调节,以确保任何一个构件只有唯一的版本在依赖中存在。在这些工作之后,最后得到的那些依赖称为已解析依赖(Resolved Dependency)。
查看当前项目的已解析依赖:
1 mvn dependency:list
查看当前项目的依赖树:
1 mvn dependency:tree
上面 2 个命令可以帮助我们详细了解项目中所有依赖的具体信息。
下面这个命令可以帮助分析当前项目的依赖。
1 mvn dependency:analyze
1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 2 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 3 <modelVersion>4.0.0</modelVersion> 4 5 <groupId>org.wzh.maven</groupId> 6 <artifactId>Demo</artifactId> 7 <version>0.0.1-SNAPSHOT</version> 8 <packaging>jar</packaging> 9 10 <name>Demo</name> 11 <url>http://maven.apache.org</url> 12 13 <build> 14 <plugins> 15 <plugin> 16 <groupId>org.apache.maven.plugins</groupId> 17 <artifactId>maven-shade-plugin</artifactId> 18 <version>1.2.1</version> 19 <executions> 20 <execution> 21 <phase>package</phase> 22 <goals> 23 <goal>shade</goal> 24 </goals> 25 </execution> 26 </executions> 27 <configuration> 28 <transformers> 29 <transformer 30 implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 31 <mainClass>org.wzh.maven.test.HelloWorld</mainClass> 32 </transformer> 33 </transformers> 34 </configuration> 35 </plugin> 36 </plugins> 37 </build> 38 39 <properties> 40 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 41 </properties> 42 43 <dependencies> 44 <dependency> 45 <groupId>junit</groupId> 46 <artifactId>junit</artifactId> 47 <version>4.7</version> 48 <scope>test</scope> 49 </dependency> 50 <dependency> 51 <groupId>org.springframework</groupId> 52 <artifactId>spring-core</artifactId> 53 <version>4.3.9.RELEASE</version> 54 </dependency> 55 <dependency> 56 <groupId>mysql</groupId> 57 <artifactId>mysql-connector-java</artifactId> 58 <version>5.1.10</version> 59 </dependency> 60 </dependencies> 61 62 63 </project>
1 package org.wzh.maven.test; 2 3 public class HelloWorld { 4 5 public String sayHello() { 6 return "Hello Maven"; 7 } 8 9 public static void main(String[] args) { 10 System.out.print(new HelloWorld().sayHello()); 11 } 12 13 }
一个简单项目的 pom 和 仅有的一个 Java 类文件。
list
tree
analyze
Unused declared dependencied found: 意指项目中未使用的,但显式声明的依赖。需要注意的是,对于这样一类依赖,我们不应该简单地直接删除其声明,而是应该仔细分析。由于 analyze 只会分析编译主代码和测试代码需要用到的依赖,一些执行测试和运行时需要的依赖它就发现不了。
还有一种情况,这里没有展示。
Used undeclared dependencied:意指项目中使用到的,但是没有显式声明的依赖。这种依赖意味着潜在的风险,当前项目直接在使用它们,例如有很多相关的 Java import 声明,而这种依赖是通过直接依赖传递进来的,当升级直接依赖的时候,相关传递性依赖的版本也可能发生变化,这种变化不易察觉,但是有可能导致当前项目出错。例如由于接口的改变,当前项目中的相关代码无法编译。这种隐藏的、潜在的威胁一旦出现,就往往需要耗费大量的时间来查明真相。因此,显式声明任何项目中直接用到的依赖。