1、可选依赖:
可选依赖不会进行传递,例如:A—>B、B—>X(可选)、B—>Y(可选),那么对于A来说,X、Y都是A的可选依赖,依赖将不会得到传递,换句话来说,X、Y对A不会又任何影响,A不会像传递性依赖一样引入X、Y,传递性依赖的表示<optional>
<dependency>
<groupId>com.ck</groupId>
<artifactId>common-data</artifactId>
<version>${common-data.version}</version>
<optional>true</optional>
</dependency>
2、排除依赖:如果A依赖B,B又依赖C,那么根据传递性依赖,那么A会引入C如果想要排除C
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring4</artifactId>
<version>${thymeleaf.version}</version>
<exclusions>
<exclusion>
<artifactId>thymeleaf</artifactId>
<groupId>org.thymeleaf</groupId>
</exclusion>
</exclusions>
</dependency>
3、归类依赖:设置统一版本号:
<properties>
<jackson-version>2.9.5</jackson-version>
</properties>
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jackson-version}</version>
</dependency>
<dependencies>
4、优化依赖:
查看当前项目已经解析依赖:mvn dependency:list
查看当前项目依赖树:mvn dependency:true
依赖分析:mvn dependency:analyze
Used undeclared dependencies found:这个是指项目中使用到的但是没有显示声明的依赖,然而是通过直接依赖传递过来的,也就是传递性依赖,当升级直接依赖的时候,相关传递性依赖的版本也可能发生变化,这种变化可能导致项目出错,因此,显示声明项目中直接用到的依赖
Unused declared dependencies found:这个是项目中未使用的,但显示声明的依赖,这类依赖需要小心分析,因为依赖分析只能分析编译主代码和测试代码需要用到的依赖,一些执行测试和运行时需要的依赖它发现不了,对于分析后实在无用的依赖,确实可以直接删除;
5、maven仓库:
分为本地仓库和远程仓库,远程仓库又分为私服和中央仓库、其它公共仓库;
本地仓库:本地仓库地址的配置文件在settings.xml文件里面
<localRepository>D:\Users\xxx\.m2\repository\</localRepository>
一般项目构建时先从本地仓库查看依赖构件,如果查不到则从远程仓库搜索构建,如果远程仓库也查不到构建则会报错,如果本地项目有A、B,A项目依赖B项目,那么可以先使用将B项目打包(打包命令 mvn clean install)放到本地仓库,然后A项目就可以依赖使用B项目;
6、配置认证信息:settings.xml
<servers>
<server>
<id>releases</id>
<username>xxx</username>
<password>xxxx</password>
</server>
<server>
<id>snapshots</id>
<username>xxxx</username>
<password>xxxxx</password>
</server>
</servers>
最关键的是id,这个id和远程仓库的id必须一致;
7、部署至远程仓库:
pom.xml文件配置:
<distributionManagement>
<repository>
<id>xx</id>
<name>xxx</name>
<url>http://localhost:8080</url>
</repository>
</distributionManagement>
id是该远程仓库的唯一标识,name是用户任取的,url表示该仓库的地址往远程仓库部署的时候一般需要认证,前面已经说过了,执行命令:mvn clean deploy,将构建部署到远程仓库;
8、镜像:镜像可以看成是仓库的代理,所有能从仓库获取的构件都可以从镜像获取到,而且速度更快;
setting.xml配置文件:
<mirrors>
<mirror>
<id>xxxx</id>
<mirrorOf>center</mirrorOf>
<name>public</name>
<url>http://xxx</url>
</mirror>
</mirrors>
<mirrorOf>的值为center,代表该镜像配置为中央仓库的镜像,任何对于中央仓库的请求都会转至该镜像,如果要代理所有仓库,那么就将值配置为*,另外三个元素id、name、url与一般仓库无异,类似的如果该镜像需要认证,也可以基于该id配置仓库认证。
9、maven插件:
查看插件信息命令:mvn help:describe -Dplugin=org.apache.maven.plugins:maven-compiler-plugin
查看项目依赖list:mvn dependency:list
查看项目依赖树:mvn:dependency:tree
插件的远程仓库配置:
<pluginRepositories>
<pluginRepository>
<id>xxxx</id>
<url>http://xxxx</url>
<releases>
<enabled>true</enabled>
<checksumPolicy>warn</checksumPolicy>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
<checksumPolicy>fail</checksumPolicy>
</snapshots>
</pluginRepository>
</pluginRepositories>
我们在配置插件的时候,经常看见插件没有配置groupId,如下所示:
<plugin>
<artifactId>maven-eclipse-plugin</artifactId>
<version>2.9</version>
</plugin>
这是因为maven在解析插件的时候,如果没有发现groupId,会自动用默认的groupId, org.apache.maven.plugins补齐,当没有配置版本号的时候,核心插件会在超级pom种设定版本,例如maven-clean-plugin。 对于非核心pom,maven2的策略是使用latest版本,这个版本可能是快照版本,不是很稳定,maven3的策略是使用release版本,这样可以避免由于快照频繁更新而导致的插件行为不稳定;
10、Maven版本号的定义:
格式:<主版本>.<次版本>.<增量版本>-<里程碑版本>
例如:1.3.4-beta-2 解释:1表示第一次重大版本,3表示大版本下的第三个次要版本,4表示此版本的第四次增量,最后的beta-2表示此版本的一个里程碑,一般的主版本、次版本是必须要的;