Maven笔记
/’mevn’/
简介
技术点
- 生成可执行的jar文件 maven-shade-plugin
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.4</version>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
<executions>
<execution>
<!-- 执行package的phase -->
<phase>package</phase>
<!-- 为这个phase绑定goal -->
<goals>
<goal>shade</goal>
</goals>
<configuration>
<!-- 过滤掉以下文件,不打包 :解决包重复引用导致的打包错误-->
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.handlers</resource>
</transformer>
<!-- 打成可执行的jar包 的主方法入口-->
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.yang.MainTest</mainClass>
</transformer>
<transformer
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.schemas</resource>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
<defaultGoal>compile</defaultGoal>
</build>
- 使用Archetype生成项目骨架
mvn archetype: generate 命令
- 传递性依赖
compile | test | provided | runtime | |
---|---|---|---|---|
compile | compile | - | - | runtime |
test | test | - | - | test |
provided | provided | - | provided | provided |
runtime | runtime | - | - | runtime |
当第二直接依赖的范围是compile的时候,传递性依赖的范围与第一章节依赖的范围一致; 当第二直接依赖的范围是test的时候,依赖不会得以传递 当第二直接依赖的范围是provided的时候,只传递第一直接依赖的范围也为provided的依赖,且传递性依赖的范围同样为provided; 当第二直接依赖的范围是runtime的时候,传递依赖的范围与第一直接依赖的范围一致,但compile例外,此时传递性一依赖的范围为runtime
- 依赖调解
第一原则:路径最近者优先 第二原则:第一声明者优先,在依赖路径长度相等的前提下,在pom中依赖声明的顺序决定了谁会被解析使用,顺序最靠前的那个依赖优胜
- 可选依赖不会传递 optional
为什么要使用可选依赖这一特性呢?可能项目B实现了两个特性,其中一个特性依赖于X,特性二依赖于Y,而且这两个特性是互斥的,用户不可能同时使用两个特性。比如B是持久层隔离工具包,它支持多种数据库,包括MYSQL、PostgreSQL等,在构建这个工具包的时候,需要这两种数据库的驱动程序,但在使用这个工具包的时候,只会依赖一种数据库
- 依赖排除
<exclusions>
<exclusion>
<groupId></groupId>
<artifactId><artifactId>
</exclusion>
</exclusions>
- 归类依赖
依赖的一类版本号可以用常量来定义
<properties>
<springframework.version>2.5.6</springframework.version>
</properties>
- 优化依赖
Maven会自动解析所有项目的直接依赖和传递性依赖,并且根据规则正确判断每个依赖的范围,对于一些依赖冲突,也能进行调节,以确保任何一个构件只有唯一的版本在依赖中存在,在这些工作之后,最后得到的那些依赖被称为已解析依赖(Resolved Dependency)。可以运行如下的命令查看当前项目的已解析依赖:mvn dependency:list
进一步了解已解析依赖的信息: mvn dependency:tree
mvn dependency:analyze 可以帮助分析当前项目的依赖 Used undeclared dependencies 项目中使用到的,但是没有显式声明的依赖 Unused declared dependencies 项目中未使用的,但是显式声明的依赖 注意:dependency:analyze 只会分析编译主代码和测试代码需要用到的依赖,一些执行测试和运行时需要的依赖它就发现不了