Maven笔记
maven,项目对象模型(POM project object model),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。
坐标(gav)
groupId:定义当前Maven项目隶属的实际项目。
artifactId:该元素定义实际项目中的一个Maven项目(模块)。
version:该元素定义Maven项目当前所处的版本。
Maven中scope参数详解
scope,配置该依赖的依赖范围。
Maven坚持惯例优于配置,所以Maven配置中的socpe的默认值是compile。在实际应用过程中经常分不清楚使用哪一个,所以直接就默认了。现在梳理一下Maven的scope:scope分为compile,test,runntime,provided,system五种。
- compile
默认的就是compile,compile表示被依赖项目需要参与当前项目的编译,当然后续的测试,运行周期也参与其中,是一个比较强的依赖。打包的时候通常需要包含进去。 - test
test表示依赖项目仅仅参与测试相关的工作,包括测试代码的编译,执行。比较典型的如junit。 - runtime
runtime表示被依赖项目无需参与项目的编译,不过后期的测试和运行周期需要其参与。与compile相比,跳过编译,说实话在终端的项目(非开源,企业内部系统)中,和compile区别不是很大。 - provided
provided意味着打包的时候可以不用包进去,别的设施(Web Container)会提供。事实上该依赖理论上可以参与编译,测试,运行等周期。相当于compile,但是在打包阶段做了exclude的动作。 - system
从参与度来说,也provided相同,不过被依赖项不会从maven仓库抓,而是从本地文件系统拿,一定需要配合systemPath属性使用。
scope的依赖传递
A–>B–>C。当前项目为A,A依赖于B,B依赖于C。知道B在A项目中的scope,那么怎么知道C在A中的scope呢?
答案是: 当C是test或者provided时,C直接被丢弃,A不依赖C; 否则A依赖C,C的scope继承于B的scope。
依赖调解
依赖调解的第一原则是:路径最近者优先。因此X(2.0)会被解析。 如果路径相同,第二原则是:第一声明者优先。在POM中依赖声明的顺序决定了谁会被解析使用,顺序靠前的那个依赖优胜。
聚合和继承:
-
聚合:一次性构建多个项目,一般通过建立一个额外的空的工程或者一个额外的pom文件 来实现
-
继承:继承会产生依赖
- 依赖传递,第一直接依赖,第二直接依赖
- 依赖调解,路径最近者优先,第一声明者优先
- 排除依赖
- 归类依赖,通过设置
<properties></properties>
属性,以变量的方式来控制相关依赖的版本
约定由于配置
生命周期
- clean
清理 clean 清理上一次构建生成的文件 - default
主要包括:- process-source:处理项目主资源文件,一般是对资源文件进行变量替换后,复制到项目输出的主classpath目录中
- compile:编译项目的主源码
- test-source:处理项目测试资源文件
- test-compile:编译项目的测试代码
- test:使用单元测试框架运行测试,测试代码不会被打包或部署
- package:接受编译好的代码,打包成可发布的格式,如 jar
- install:将包安装到maven本地仓库,供本地其他maven项目使用
- deploy:将最终的包复制到远程仓库,供其他开发人员和maven项目使用
- site
- site:生产项目站点文档
- site-deploy:将生成的项目站点发布到服务器上
maven中的插件仓库
maven中,区别对待依赖的远程仓库与插件仓库,所以当Maven错需要的插件在本地仓库不存在时,就需要配置一个远程的插件仓库。
示例:
Maven内置的插件仓库配置:
<pluginRepositories>
<pluginRepository>
<id>center</id>
<name>Maven Plugin Repository</name>
<url>http://repo1.maven.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<updatePolicy>never</updatePolicy>
</releases>
</pluginRepository>
</pluginRepositories>
阿里云的插件仓库:
<pluginRepositories>
<pluginRepository>
<id>public</id>
<name>aliyun nexus</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
示例中,关闭了对 SNAPSHOT 的支持,以防止引入 SNAPSHOT 版本的插件二导致不稳定的构建。一般来说,中央仓库所包含的插件完全能够满足我们的需要,因此也不需要配置其他的插件仓库
pom中的build标签
pluginManagement的配置
dependencyManagement元素帮助管理依赖,而pluginManagement元素来帮助管理插件,一般在父 pom 中配置。
在 build 标签下增加如下配置(第一个encoding是否有必要添加?)
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java-version}</source>
<target>${java-version}</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</pluginManagement>
跳过测试配置
(版本号是否有必要写?)
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.5</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
资源文件的打包
将非默认路径下的资源文件打包到项目中
<resources>
<resource>
<!-- 设定主资源目录 -->
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<!-- 排除如下配置中包含的资源类型文件 -->
<excludes>
<exclude>**/*.yaml</exclude>
</excludes>
<!-- maven default生命周期,process-resources阶段执行maven-resources-plugin插件的resources目标处理主资源目下的资源文件时,指定处理后的资源文件输出目录,默认是${build.outputDirectory}指定的目录-->
<!--<targetPath>${build.outputDirectory}</targetPath> -->
<!-- maven default生命周期,process-resources阶段执行maven-resources-plugin插件的resources目标处理主资源目下的资源文件时,是否对主资源目录开启资源过滤 -->
<filtering>true</filtering>
</resource>
</resources>
使用nexus搭建私服
nexus [ˈnɛksəs] 联结,关系 (耐克 sao s)
私服的作用:jar包可以从私服上面下载,私服上面没有,在通过私服去连接远程仓库下载,可以在私服上面发布自己的私有的jar包