maven学习笔记

r囧r小猫 2022-08-12 02:28 337阅读 0赞

Maven学习笔记

一、Maven配置文件

坐标:Pom.xml文件通过groupId、artifactId、version定义一个项目的基本坐标。(必填)

  1. groupId:定义项目属于哪个组,这个组往往和项目所在的组织和公司存在关联。譬如公司hikvision创建一个名字为myproject的项目,那么groupId就应该是:com.hikvision.myproject。

  2. artifactId:定义当前Maven项目在组中唯一ID,相当于属于项目组内的一个子模块(即group成员),譬如门禁模块为door,那么artifactId就是:myproject-door。通常命名为”实际项目名称-子模块名称”

  3. version:定义当前模块的版本(即artifact版本)。

  4. package:定义Maven项目的打包方式(不定义,默认jar包)。

  5. classifier:定义构件输出的一些附属构件。例如:xxx-xxx-1.1.0-javadoc.jar、xxx-xxx-1.1.0-sources.jar。该属性不能直接定义,有插件帮助生成。

二、Maven操作命令

2.1操作命令

  1. clean:clean: 删除target目录

  2. resources:resources:加载资源文件

  3. 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

20140917100855445

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.archetypes:maven-archetype-quickstart:1.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元素,以声明一个或者多个项目依赖。每个依赖可以包含的元素有:

  1. groupId、artifactId和version:依赖的基本坐标,对于任何一个依赖来说,基本坐标是最重要的,Maven根据坐标才能找到需要的依赖。

  2. type:依赖类型,对应于项目坐标定义的packaging。大部分情况下不必声明,其默认值为jar。

  3. scope:依赖的范围【compile(编译、测试、运行)、test(测试)、provided(编译、测试)、runtime(测试、运行)、system(编译、测试)、import】。

    20140917100517218

  4. optional:标记依赖是否可选。

  5. 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仓库分类如下图所示:

20140919180355890

4.2 Maven私服

私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,私服代理广域网的远程仓库,供局域网内的Maven用户使用。当Maven需要下载构件的时候,它从私服请求,如果私服上不存在该构件,则从外表的远程仓库下载,缓存在私服上之后,再为Maven的下载请求提供服务。

私服用途

20140919180615042

Maven私服仓库分类

hosted 类型的仓库,内部项目的发布仓库

releases 内部的模块中release模块的发布仓库

snapshots 发布内部的SNAPSHOT模块的仓库

3rd party 第三方依赖的仓库,这个数据通常是由内部人员自行下载之后发布上去

proxy 类型的仓库,从远程中央仓库中寻找数据的仓库

group 类型的仓库,组仓库用来方便我们开发人员进行设置的仓库

Maven私服优点:

  1. 节省自己的外围带宽

  2. 加速Maven构件

  3. 部署第三方构件

  4. 提高稳定性,增强控制

  5. 降低中间仓库的负荷

五、Maven生命周期

Maven拥有三套互相独立的声明周期,他们分别为clean、default和site。clean的声明周期目的是清理项目,default生命周期的目的是构件项目,而site声明周期的目的是建立项目站点。

5.1 clean生命周期

  1. clean声明周期的目的是清理项目,它包含三个阶段:

1) pre-clean 执行一些清理前需要完成的工作。

2) clean 清理上一次构建生产的文件。

3) post-clean 执行一些清理后需要完成的工作。

5.2 default生命周期

  1. 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生命周期

  1. Site生命周期的目的是建立和发布项目站点,maven能够给予pom所包含的信息,自动生成一个友好的站点,方便团队交流和发布项目信息。

1) pre-site:执行一些在生成项目站点之前需要完成的工作。

2) site:生成项目站点文档。

3) post-site:执行一些在生成项目站点之后需要完成的工作。

4) site-depoly:将生成的项目站点发布到服务器上。

六、Maven聚合与继承

  1. 多模块开发需要聚合,而避免pom重复,我们常常继承。

聚合于继承两个特性的共同点:聚合pom与继承关系中的父pom的package都必须是pom。同时,聚合模块与继承关系中的父模块除了pom之外都没有实际的内容。

  1. 在现有的实际项目中,我们往往发现一个pom既是聚合Pom,又是父pom,这么做主要是为了方便。这样我们可以将这2pom合并为一个。

可继承的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:

  1. <modelVersion>4.0.0</modelVersion>
  2. <groupId>com.demo.cms</groupId>
  3. <artifactId>cms-parent</artifactId>
  4. <version>2.0.0-SNAPSHOT</version>
  5. <packaging>pom</packaging>
  6. <name>cms2.0.0系统</name>
  7. <url>http://maven.apache.org</url>
  8. <modules>
  9. <module>common-util</module>
  10. <module>module-base-web</module>
  11. <module>module-acs-web</module>
  12. <module>bundle-war</module>
  13. </modules>

子模块pom:

  1. <modelVersion>4.0.0</modelVersion>
  2. <parent>
  3. <groupId>com.demo.cms</groupId>
  4. <artifactId>cms-parent</artifactId>
  5. <version>2.0.0-SNAPSHOT</version>
  6. <relativePath>../pom.xml</relativePath>
  7. </parent>
  8. <artifactId>${cms-module-base-web.aid}</artifactId>
  9. <packaging>war</packaging>
  10. <name>${cms-module-base-web.aid}</name>
  11. <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)

  1. <profiles>
  2. <profile>
  3. <id>nexus</id>
  4. <repositories>
  5. <repository>
  6. <id>nexus</id>
  7. <name>Nexus</name>
  8. <url>http://10.16.36.30:8081/nexus/content/groups/public/</url>
  9. <releases><enabled>true</enabled></releases>
  10. <snapshots><enabled>true</enabled></snapshots>
  11. </repository>
  12. </repositories>
  13. </profile>
  14. <pluginRepositories>
  15. <pluginRepository>
  16. <id>nexus</id>
  17. <name>Nexus</name>
  18. <url>http://10.16.35.17:8081/nexus/content/groups/public</url>
  19. <releases><enabled>true</enabled></releases>
  20. <snapshots><enabled>true</enabled></snapshots>
  21. </pluginRepository>
  22. </pluginRepositories>
  23. </profiles>
  24. <activeProfiles>
  25. <activeProfile>nexus</activeProfile>
  26. </activeProfiles>

通过以上配置已经能够然本机所有的Maven项目从Nexus私服下载构件,但是Maven除了从Nexus下载构件之外,还会时不时地访问中央仓库central,我们希望所有的Maven请求都仅仅通过Nexus,以全面发挥私服的作用,这个就需要配置Maven镜像了,可以创建一个匹配任何仓库的镜像,镜像地址为私服地址,这样Maven对于任何仓库的构件下载请求都很转到私服中,具体配置如下:

  1. <mirrors>
  2. <mirror>
  3. <id>nexus</id>
  4. <mirrorOf>*</mirrorOf>
  5. <name>Nexus Mirror</name>
  6. <url>http://10.16.35.17:8081/nexus/content/groups/public</url>
  7. </mirror>
  8. </mirrors>
  9. <profiles>
  10. <profile>
  11. <id>nexus</id>
  12. <repositories>
  13. <repository>
  14. <id>central</id>
  15. <name>Nexus</name>
  16. <url>http://central</url>
  17. <releases><enabled>true</enabled></releases>
  18. <snapshots><enabled>true</enabled></snapshots>
  19. </repository>
  20. </repositories>
  21. </profile>
  22. <pluginRepositories>
  23. <pluginRepository>
  24. <id>central</id>
  25. <name>Nexus</name>
  26. <url>http://central</url>
  27. <releases><enabled>true</enabled></releases>
  28. <snapshots><enabled>true</enabled></snapshots>
  29. </pluginRepository>
  30. </pluginRepositories>
  31. </profiles>
  32. <activeProfiles>
  33. <activeProfile>nexus</activeProfile>
  34. </activeProfiles>

以上配置他们的id都为central,也就是说覆盖了超级POM中央仓库配置,它们的url已经无关紧要,因为所有请求都会通过镜像访问私服地址,配置仓库及插件惨啊该空的目的是开启对快照本性下载的支持。当Maven需要下载发布版本或者快照版本构件的时候,它首先检查central,看该类型的构件是否支持,没有再根据镜像匹配规则转而访问私服仓库地址。

7.2 配置上传构件至私服

在pom中添加如下信息:

  1. <distributionManagement>
  2. <repository>
  3. <id>releases</id>
  4. <name>Nexus releases Repository</name>
  5. <url>http://localhost:8081/nexus/content/repositories/releases/</url>
  6. </repository>
  7. <snapshotRepository>
  8. <id>snapshots</id>
  9. <name>Nexus Snapshots Repository</name>
  10. <url>http://localhost:8081/nexus/content/repositories/snapshots/</url>
  11. </snapshotRepository>
  12. </distributionManagement>

然后因为Nexus仓库对于匿名用户是只读的,为了能够部署构件,还需要在settings.xml中配置认证信息,如下:

  1. <servers>
  2. <server>
  3. <id>releases</id>
  4. <username>admin</username>
  5. <password>admin123</password>
  6. </server>
  7. <server>
  8. <id>snapshots</id>
  9. <username>admin</username>
  10. <password>admin123</password>
  11. </server>
  12. </servers>

发表评论

表情:
评论列表 (有 0 条评论,337人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Maven学习笔记

    什么是maven,有何作用 Maven 是专门用于构建和管理Java相关项目的工具。 功能 1. 最直观的感受是每个maven项目都有一个 pom.xml 文

    相关 maven学习笔记

    Maven学习笔记 一、Maven配置文件 坐标:Pom.xml文件通过groupId、artifactId、version定义一个项目的基本坐标。(必填) 1.  

    相关 maven学习笔记

    一.介绍 \---- \\Maven\\是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。 1. bin目录