maven学习笔记
Maven学习笔记
一、Maven配置文件
坐标:Pom.xml文件通过groupId、artifactId、version定义一个项目的基本坐标。(必填)
groupId:定义项目属于哪个组,这个组往往和项目所在的组织和公司存在关联。譬如公司hikvision创建一个名字为myproject的项目,那么groupId就应该是:com.hikvision.myproject。
artifactId:定义当前Maven项目在组中唯一ID,相当于属于项目组内的一个子模块(即group成员),譬如门禁模块为door,那么artifactId就是:myproject-door。通常命名为”实际项目名称-子模块名称”
version:定义当前模块的版本(即artifact版本)。
package:定义Maven项目的打包方式(不定义,默认jar包)。
classifier:定义构件输出的一些附属构件。例如:xxx-xxx-1.1.0-javadoc.jar、xxx-xxx-1.1.0-sources.jar。该属性不能直接定义,有插件帮助生成。
二、Maven操作命令
2.1操作命令
clean
删除target目录
resources:resources:加载资源文件
compiler:compile:将项目主代码编译至target/classes目录
序号 | 命令 | 描述 |
1 | mvn clean compile | 对项目进行编译 |
2 | mvn clean test | 对项目进行编译并测试 |
3 | mvn clean package | 生成target目录,编译、测试代码,生成测试报告,生成jar/war文件 |
4 | mvn clean install | 对项目进行安置 |
备注:以上操作命令按照序号,从大到小,大序号的操作都包含小序号操作。
mvn clean compile执行 : 1)mvn clean:clean 2)mvn resources:resources 3)mvn compiler:compile
mvn clean test执行:1)mvn clean compile 2) mvn resources:testResources 3)mvn compiler:testCompile
2.2可执行Jar
生成可执行Jar包:需要在pom.xml配置如下,并执行操作java -jar target\helloworld-0.0.1-SNAPSHOT.jar
2.3创建项目骨架
下面用命名行创建一个最基本的maven项目
mvn archetype:generate
首次运行时,mvn会从远程”中央仓库”下载一些必需的文件到”本地仓库” -(如果你有兴趣,可以在等待下载过程中,观察一下”C:\Users\当前用户名\.m2\repository”到底下载了些啥东东)
下载完成后,会自动进入交互模式,会让你输入一些基本信息,类似下面这样:
…
[INFO] Generating project in Interactive mode (这里会卡一会儿,因为要联网获取项目模板)
[INFO] No archetype defined. Using maven-archetype-quickstart (org.apache.maven.archetypes1.0)
Choose archetype:
1: remote -> br.com.ingenieux:elasticbeanstalk-service-webapp-archetype (A Maven Archetype Encompassing RestAssured, Jetty, Jackson, Guice and Jersey for Publishing JAX-RS-based Services on AWS’ Elastic Beanstalk Service)
… (这里会自动列出很多项目模板,每种模板前面会有一个数字序号)
336: remote -> org.apache.maven.archetypes:maven-archetype-quickstart (An archetype which contains a sample Maven project.)
…
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 336: (这里根据每个人机器上安装的eclipse插件不同,可能默认的数字不是这个,先不管,直接回车)
Choose org.apache.maven.archetypes:maven-archetype-quickstart version:
1: 1.0-alpha-1
2: 1.0-alpha-2
3: 1.0-alpha-3
4: 1.0-alpha-4
5: 1.0
6: 1.1
Choose a number: 6: (直接回车)
Define value for property ‘groupId’: : com.hikversion.myproject (可暂时先理解成类似package或namespace的名称,通常我们填写组织机构名称缩写)
Define value for property ‘artifactId’: : myproject-door (组件名称,可暂时理解成项目名称)
Define value for property ‘version’: 1.0-SNAPSHOT: : (版本号,直接回车,默认1.0-SNAPSHOT)
Define value for property ‘package’: com.hikversion.myproject : : (打包后的jar文件名,项目包名称)
Confirm properties configuration:
groupId: com.hikversion.myproject
artifactId: myproject-door
version: 1.0-SNAPSHOT
package: com.hikversion.myproject
- Y: : (直接回车确认) [INFO] —————————————————————————————————————— [INFO] Using following parameters for creating project from Old (1.x) Archetype: maven-archetype-quickstart:1.1 [INFO] —————————————————————————————————————— [INFO] Parameter: groupId, Value: com.hikversion.myproject [INFO] Parameter: packageName, Value: com.hikversion.myproject [INFO] Parameter: package, Value: com.hikversion.myproject [INFO] Parameter: artifactId, Value: myproject-door … [INFO] ———————————————————————————————————— [INFO] BUILD SUCCESS (看到这个,表示项目创建成功!) [INFO] ———————————————————————————————————— …*
三 、Maven依赖
3.1 Spring 依赖
Spring 依赖:spring-core,spring-beans,spring-context,spring-context-support这些jar包是实现spring依赖注入必须的依赖。
3.2 Dependencies坐标
根元素project下的dependencies可以包含一个或者多个dependency元素,以声明一个或者多个项目依赖。每个依赖可以包含的元素有:
groupId、artifactId和version:依赖的基本坐标,对于任何一个依赖来说,基本坐标是最重要的,Maven根据坐标才能找到需要的依赖。
type:依赖类型,对应于项目坐标定义的packaging。大部分情况下不必声明,其默认值为jar。
scope:依赖的范围【compile(编译、测试、运行)、test(测试)、provided(编译、测试)、runtime(测试、运行)、system(编译、测试)、import】。
optional:标记依赖是否可选。
exclusions:用来排除传递性依赖。
3.3 Maven依赖调解
Maven依赖调解第一原则:路径最近者优先。
例如:项目A有这样的依赖关系:A->B->C->X(1.0)和A->D->X(2.0),X是A的传递性依赖,但是两条依赖路径上有两个版本的X,那么Maven会选择X(2.0),它的路径长度最短。
Maven依赖调解第二原则:第一声明者优先。
例如:项目A有这样的依赖关系:A->B->Y(1.0)和A->C->Y(2.0),Y(1.0)和Y(2.0)依赖路径长度一样。如果B的依赖声明在C之前,那么Y(1.0)就会被解析使用。
3.4 排除依赖
应用场景:
如果我们不想要传递依赖进来的某个jar包,可能由于某种原因对其的版本不满意,希望依赖一个可靠版本,那么我们就需要使用exclusion标签排除依赖,然后自己手动声明依赖关系。
3.5 归类依赖
应用场景:
由于我们pom.xml中可能存在很多依赖关系,都是来自同一个项目。比如Spring Framework依赖中的spring-core-2.5.6.jar,spring-beans-2.5.6.jar,spring-context-2.5.6.jar都是来自项目org.springframework。因此我们需要控制他们版本相同,想要在升级该模块时,依赖版本统一升级。那么我们需要按如下操作执行:我们只在唯一地方定义了版本,并在dependency中引用这一版本,升级时就只用修改一个地方。
3.6优化依赖
mvn dependency:list :查看项目所有已解析依赖。
mvn dependency:tree :查看项目依赖树,展示依赖的层次关系。
mvn dependency:analyze :分析编译主代码和测试代码所用到的依赖。
主要能分析出
1)Unused declared dependencies found项目中使用,但未显示声明的依赖
2)used undeclared dependencies found项目中未使用,但已声明的依赖。
四、Maven仓库
4.1 Maven仓库
Maven仓库分为两类:本地仓库和远程仓库,当Maven根据坐标去寻找构件时候,它会首先查看本地仓库,如果本地仓库存在此构件,则直接使用;如果本地仓库不存在此构件或者需要更加新的构件版本,Maven就会去远程仓库查找并下载到本地仓库再使用。如果本地仓库和远程仓库都没有需要的构件,Maven就会报错。
Maven仓库分类如下图所示:
4.2 Maven私服
私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,私服代理广域网的远程仓库,供局域网内的Maven用户使用。当Maven需要下载构件的时候,它从私服请求,如果私服上不存在该构件,则从外表的远程仓库下载,缓存在私服上之后,再为Maven的下载请求提供服务。
私服用途:
Maven私服仓库分类:
hosted 类型的仓库,内部项目的发布仓库
releases 内部的模块中release模块的发布仓库
snapshots 发布内部的SNAPSHOT模块的仓库
3rd party 第三方依赖的仓库,这个数据通常是由内部人员自行下载之后发布上去
proxy 类型的仓库,从远程中央仓库中寻找数据的仓库
group 类型的仓库,组仓库用来方便我们开发人员进行设置的仓库
Maven私服优点:
节省自己的外围带宽
加速Maven构件
部署第三方构件
提高稳定性,增强控制
降低中间仓库的负荷
五、Maven生命周期
Maven拥有三套互相独立的声明周期,他们分别为clean、default和site。clean的声明周期目的是清理项目,default生命周期的目的是构件项目,而site声明周期的目的是建立项目站点。
5.1 clean生命周期
clean声明周期的目的是清理项目,它包含三个阶段:
1) pre-clean 执行一些清理前需要完成的工作。
2) clean 清理上一次构建生产的文件。
3) post-clean 执行一些清理后需要完成的工作。
5.2 default生命周期
Default生命周期定义了正真构建时所需要的步骤,它是所有生命周期中最核心的部分,其保护的阶段如下:
1) validate
2) initialize
3) generate-sources
4) process-sources:处理项目主资源文件,将src/main/resources进行变量替换后,复制到项目输出的主classpath中。
5) generate-resources
6) process-resources
7) compile:编译项目的主源码,将src/main/java目录下的java文件编译成class输出到主classpath中。
8) process-classes
9) generate-test-sources
10) process-test-sources:处理项目测试资源文件,将src/test/resources进行变量替换后,复制到项目输出测试的classpath中。
11) generate-test-resources
12) process-test-resources
13) test-compile:编译项目的测试代码,将src/test/java目录下的java文件编译成class输出到测试classpath目录中。
14) process-test-classes
15) test:使用单元测试框架运行测试,测试代码不会被打包或部署。
16) prepare-package
17) package:接受编译好的代码,打包成可发布的格式,如jar.
18) pre-integration-test
19) integration-test
20) post-integration-test
21) verify
22) install:将包安装到Maven本地仓库,供本地其他项目使用。
23) depoly:将最终的包复制到远程仓库,供其他开发人员和Maven项目使用。
5.3 site生命周期
Site生命周期的目的是建立和发布项目站点,maven能够给予pom所包含的信息,自动生成一个友好的站点,方便团队交流和发布项目信息。
1) pre-site:执行一些在生成项目站点之前需要完成的工作。
2) site:生成项目站点文档。
3) post-site:执行一些在生成项目站点之后需要完成的工作。
4) site-depoly:将生成的项目站点发布到服务器上。
六、Maven聚合与继承
多模块开发需要聚合,而避免pom重复,我们常常继承。
聚合于继承两个特性的共同点:聚合pom与继承关系中的父pom的package都必须是pom。同时,聚合模块与继承关系中的父模块除了pom之外都没有实际的内容。
在现有的实际项目中,我们往往发现一个pom既是聚合Pom,又是父pom,这么做主要是为了方便。这样我们可以将这2个pom合并为一个。
可继承的pom元素:
1) groupId
2) version
3) description
4) organization:项目的组织信息
5) inceptionYear:项目的创始年份
6) url:项目的URL地址
7) developers:项目的开发者信息
8) contributors:项目的贡献者信息
9) distributionManagement:项目的部署配置
10) issueManagement:项目的缺陷跟踪系统信息
11) ciManagement:项目的持续继承系统信息
12) scm:项目的版本控制系统信息
13) mailingLists:项目的邮件列表信息
14) properties:自定义的Maven属性
15) dependencies:项目的依赖配置
16) dependencyManagement:项目的依赖管理配置
17) repositories:项目的仓库配置
18) build:包括项目源码目录配置、输出目录配置、插件配置、插件管理配置等。
19) reporting:包括项目的报告输出目录配置、报告插件配置等。
注意:dependencyManagement元素下的依赖声明不会引入构件的依赖,不过它能够约束dependencies下的依赖使用。
父pom:
<modelVersion>4.0.0</modelVersion>
<groupId>com.demo.cms</groupId>
<artifactId>cms-parent</artifactId>
<version>2.0.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>cms2.0.0系统</name>
<url>http://maven.apache.org</url>
<modules>
<module>common-util</module>
<module>module-base-web</module>
<module>module-acs-web</module>
<module>bundle-war</module>
</modules>
子模块pom:
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.demo.cms</groupId>
<artifactId>cms-parent</artifactId>
<version>2.0.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>${cms-module-base-web.aid}</artifactId>
<packaging>war</packaging>
<name>${cms-module-base-web.aid}</name>
<url>http://maven.apache.org</url>
裁剪翻译堆:
一般来说,用户会选择构建整个项目或者选择构建单个模块,但有些时候,用户会想要仅仅构件完成反应堆中的某些模块,换句话说。用户需要实时地剪裁反应堆。
Maven命令如下:mvn –h查看帮助
mvn –am :同时构建所列模块的依赖模块。
mvn –amd:同时构建依赖于所列模块的模块。
mvn –pl:构建指定的模块,模块间用逗号分隔。
mvn –rf:从知道的模块回复反应堆。
七、Nexus私服
Nexus仓库拥有四种类型:group(仓库组)、hosted(宿主)、proxy(代理)、virtual(虚拟)。
7.1 配置从私服下载构建
配置从私服下载构建(修改settings.xml)
<profiles>
<profile>
<id>nexus</id>
<repositories>
<repository>
<id>nexus</id>
<name>Nexus</name>
<url>http://10.16.36.30:8081/nexus/content/groups/public/</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</repository>
</repositories>
</profile>
<pluginRepositories>
<pluginRepository>
<id>nexus</id>
<name>Nexus</name>
<url>http://10.16.35.17:8081/nexus/content/groups/public</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</pluginRepository>
</pluginRepositories>
</profiles>
<activeProfiles>
<activeProfile>nexus</activeProfile>
</activeProfiles>
通过以上配置已经能够然本机所有的Maven项目从Nexus私服下载构件,但是Maven除了从Nexus下载构件之外,还会时不时地访问中央仓库central,我们希望所有的Maven请求都仅仅通过Nexus,以全面发挥私服的作用,这个就需要配置Maven镜像了,可以创建一个匹配任何仓库的镜像,镜像地址为私服地址,这样Maven对于任何仓库的构件下载请求都很转到私服中,具体配置如下:
<mirrors>
<mirror>
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<name>Nexus Mirror</name>
<url>http://10.16.35.17:8081/nexus/content/groups/public</url>
</mirror>
</mirrors>
<profiles>
<profile>
<id>nexus</id>
<repositories>
<repository>
<id>central</id>
<name>Nexus</name>
<url>http://central</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</repository>
</repositories>
</profile>
<pluginRepositories>
<pluginRepository>
<id>central</id>
<name>Nexus</name>
<url>http://central</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</pluginRepository>
</pluginRepositories>
</profiles>
<activeProfiles>
<activeProfile>nexus</activeProfile>
</activeProfiles>
以上配置他们的id都为central,也就是说覆盖了超级POM中央仓库配置,它们的url已经无关紧要,因为所有请求都会通过镜像访问私服地址,配置仓库及插件惨啊该空的目的是开启对快照本性下载的支持。当Maven需要下载发布版本或者快照版本构件的时候,它首先检查central,看该类型的构件是否支持,没有再根据镜像匹配规则转而访问私服仓库地址。
7.2 配置上传构件至私服
在pom中添加如下信息:
<distributionManagement>
<repository>
<id>releases</id>
<name>Nexus releases Repository</name>
<url>http://localhost:8081/nexus/content/repositories/releases/</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<name>Nexus Snapshots Repository</name>
<url>http://localhost:8081/nexus/content/repositories/snapshots/</url>
</snapshotRepository>
</distributionManagement>
然后因为Nexus仓库对于匿名用户是只读的,为了能够部署构件,还需要在settings.xml中配置认证信息,如下:
<servers>
<server>
<id>releases</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
</servers>
还没有评论,来说两句吧...