maven学习笔记

Maven学习笔记

一、Maven配置文件

坐标Pom.xml文件通过groupIdartifactIdversion定义一个项目的基本坐标。(必填

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

 

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 (可暂时先理解成类似packagenamespace的名称,通常我们填写组织机构名称缩写)
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.       groupIdartifactIdversion:依赖的基本坐标,对于任何一个依赖来说,基本坐标是最重要的,Maven根据坐标才能找到需要的依赖。

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

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

      

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

5.       exclusions:用来排除传递性依赖。

 

 

3.3 Maven依赖调解

Maven依赖调解第一原则:路径最近者优先。

例如:项目A有这样的依赖关系:A->B->C->X(1.0)A->D->X(2.0)XA的传递性依赖,但是两条依赖路径上有两个版本的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.jarspring-beans-2.5.6.jarspring-context-2.5.6.jar都是来自项目org.springframework。因此我们需要控制他们版本相同,想要在升级该模块时,依赖版本统一升级。那么我们需要按如下操作执行:我们只在唯一地方定义了版本,并在dependency中引用这一版本,升级时就只用修改一个地方。

 

3.6优化依赖

mvn dependency:list    :查看项目所有已解析依赖。

mvn dependency:tree   :查看项目依赖树,展示依赖的层次关系。

mvn dependency:analyze :分析编译主代码和测试代码所用到的依赖。

主要能分析出

1Unused declared dependencies found项目中使用,但未显示声明的依赖

2used 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私服优点:

1.       节省自己的外围带宽

2.       加速Maven构件

3.       部署第三方构件

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

5.       降低中间仓库的负荷

 

 

五、Maven生命周期

Maven拥有三套互相独立的声明周期,他们分别为cleandefaultsiteclean的声明周期目的是清理项目,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与继承关系中的父pompackage都必须是pom。同时,聚合模块与继承关系中的父模块除了pom之外都没有实际的内容。

     在现有的实际项目中,我们往往发现一个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

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


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值