一小时教你学会 Maven 项目的构建与管理(2)

  • 2020 年 3 月 18 日
  • 筆記

Maven翻译成中文是“专家、内行”。Maven是Apache组织中一个颇为成功的开源项目,Maven主要服务于基于Java平台的项目构建、依赖管理和项目信息管理的优秀工具。

—————–来自小马哥的故事


四种 Maven 项目创建方式

手动方式构建

Maven项目由一个自己默认的配置,使用者不需要修改那些约定的内容,这就是“约定优于配置”,按照Maven项目目录约定,手动创建各个文件夹即可,一般不会使用这种方式。

动态web的Maven项目的目录约定如下图所示:

命令行

本地磁盘建立一个空目录C:/maven/hello,命令行进入到hello目录,执行下面的命令 mvn archetype:generate -DgroupId=com.cloud.hellomaven -DartifactId=hellomaven-service -Dversion=1.0.0-SNAPSHOT -Dpackage=com.cloud.service

执行成功的话会自动在hello中创建符合maven项目约定的目录结构。

说明

◆ archetype:generate:生成maven项目骨架。

◆ DgroupId指定maven坐标的groupId

◆ DartifactId指定maven坐标的artifactId

◆ Dversion指定maven坐标的version

◆ Dpackage指定maven项目的src下的包名

自动创建的maven项目结构如下:

Eclipse IDE

Eclipse提供了一个很好的插件m2eclipse无缝将Maven和Eclipse集成在一起,配置插件选择本地maven目录和配置文件setting.xml即可。

点击Eclipse菜单栏File->New->Ohter->Maven,选择Maven Project,一路默认Next,有一步需要填写Group Id、Artifact Id、Version、选择打包方式Package(jar、war、pom),选择编译环境即可。

完成后目录结构如下:

Idea IDE

Idea IDE是一款很不错的开发Maven项目的IDE,创建一个maven web项目的过程如下:

选择File-New-Project,选择Maven,勾选Create from archetype,选择maven-archetype-webapp

点击Next,填写Group Id、Artifact Id、Version三项,

点击Next,选择Maven home,选择setting file,

点击Next,填写Project name,选择项目路径即可,

Finish完成maven web项目创建。

Setting文件配置与POM 文件解析

Setting文件配置

配置用户范围和全局范围的setting.xml

全局范围: ${maven.conf}/settings.xml文件可以全局定制Maven的行为,对一台机器上的所有用户有效。

用户范围: ${user.home}/.m2/settings.xml,只有当前用户才会受到该配置影响,还便于Maven的升级,Maven升级新版本时不需要触动该文件,推荐配置用户范围。

设置HTTP代理

公司网络需要通过安全认证的代理访问因特网,这种情况下需要为Maven配置HTTP代理,才能正常访问外部仓库下载所需要的资源。

在settings.xml文件中添加代理配置。

 <proxies>      <proxy>        <id>myproxy</id>        <active>true</active>        <protocol>http</protocol>        <host>192.0.0.100</host>        <port>1234</port>        <username>xxxxx</username>        <password>xxxxx</password>        <nonProxyHosts>*.xxx.com|xxx.org</nonProxyHosts>      </proxy>   </proxies>

proxies下可以添加多个proxy节点,默认第一个active为true的会生效。

nonProxyHost表示不需要代理访问的地址。中间的竖线分隔多个地址,此处可以使用星号作为通配符号。

远程仓库的认证

一些远程仓库出于安全考虑需要提供用户名、密码进行认证才能访问,这时需要配置认证信息,认证信息必须配置到setting.xml文件中,只放在本机,其他成员不可见,在setting.xml文件中添加server配置,一个servers可以配置一个或者多个server,假设一个id为feiyue-repo的仓库配置认证如下:

<servers>    <server>     <id>feiyue-repo</id>     <username>repo-username</username>     <password>repo-pwd</password>    </server>  </servers>

setting.xml文件中server元素的id必须与pom.xml文件中需要认证的repository元素的id完全一致。

镜像

如果仓库X可以提供仓库Y存储的所有内容,则X可以被称为Y的一个镜像。镜像往往能够提供比中央仓库更快的服务,配置Maven使用镜像来代替中央仓库,编辑setting.xml文件。

<mirrors>   <mirror>        <id>jboss-public-repository-group</id>        <mirrorOf>central</mirrorOf>       <name>JBoss Public Repository Group</name>  <url>http://repository.jboss.org/nexus/content/groups/public</url>   </mirror>  </mirrors>

mirrorOf:值为central,表示该配置为中央仓库的镜像,任何对于中央仓库的请求都会转至该镜像;

id:是远程仓库的唯一标识。

name:阅读方便可自定义的名称。

url:远程仓库的地址。

如果需要认证,基于该id配置仓库认证。

mirrorOf取值如下

*:匹配所有远程仓库    external:*匹配所有远程仓库,使用localhost的除外,使用file://协议的除外,即匹配不在本机上的远程仓库;    rep1,rep2:匹配id=rep1和id=rep2的仓库,使用逗号分隔多个远程仓库;    *,!rep2:匹配所有远程仓库,rep2除外,使用感叹号将仓库从匹配中排除。

POM文件常用配置解析

parent父项目配置

<parent>      <groupId>com.feiyue.parent</groupId>      <artifactId>feiyue-parent</artifactId>      <version>1.0-SNAPSHOT</version>      <relativePath>../pom.xml</relativePath>  </parent>

project根节点下配置parent节点指定继承的父项目坐标,groupId、artifactId、version必选,唯一标识父项目,relativePath:可选,父项目的pom.xml文件的相对路径,默认值是../pom.xml.

Maven首先在当前构建项目的地方寻找父项目的pom,其次在本地文件系统的relativePath位置,然后在本地仓库,最后在远程仓库寻找父项目的pom.

dependency依赖配置

<dependency>  <groupId>xx</groupId>  <artifactId>yy</artifactId>  <version>x.x</version>  <scope> </scope>  <type></type>  <optional></optional>  <exclusions>    <exclusion></exclusion>  </exclusions>  </dependency>

groupId、artifactId、version必选,依赖的基本坐标,找到需要的依赖。

type:依赖的类型,对应于项目坐标中定义的packaging,该元素不必声明默认为jar.

scope:依赖的范围

Maven在编译项目主代码时使用一套classpath,主代码中使用到的其他jar以依赖被引入到classpath中;Maven在编译和执行测试的时候会使用另外一套classpath;实际运行Maven项目的时候,又会使用一套classpath。故Maven项目依赖范围就是控制依赖于三种classpath(编译classpath、测试classpath、运行classpath)的关系。

Maven依赖范围有以下几种

compile:编译依赖范围,没有指定默认使用该依赖范围。对于编译、测试、运行三种classpath都有效。例如:spring-core。

test:测试依赖范围,只对测试classpath有效,在编译主代码或者运行项目是无法使用。例如:junit。

provided:已提供依赖范围,对于编译和测试classpath有效,运行时无效。例如:servlet-api

runtime:运行时依赖范围,对于测试和运行classpath有效,但在编译主代码时无效。例如:spring-jdbc。

system:系统依赖范围,和provided作用一致。但是system范围的依赖时必须通过systemPath元素显示第指定依赖文静的路径。由于该类依赖不是通过Maven仓库解析的,而且往往与本机系统绑定,可能造成不可抑制,应谨慎使用。

import:只使用在dependencyManagement中,表示从其他的pom中导入depency的配置,不会对三种classpath产生实际的影响。

optional:标记依赖是否可选

exclusions:用来排除传递性依赖

pluginManagement默认插件配置

配置到project-build节点中,配置供子项目引用的插件。

<pluginManagement>      <!--使用的插件列表-->      <plugins>          <!--plugin元素包含描述插件所需要的信息-->          <plugin>              <!--插件在仓库里的groupId-->              <groupId></groupId>              <!--插件在仓库里的artifactId-->              <artifactId></artifactId>              <!--被使用的插件的版本-->              <version></version>              <!--是否从该插件下载Maven扩展(例如打包和类型处理器)默认为false,由于性能原因,只有在真需要下载时,该元素才被设置成true。-->              <extensions></extensions>              <!--在构建生命周期中执行一组目标的配置。每个目标可能有不同的配置。-->              <executions>                  <!--execution元素包含了插件执行需要的信息-->                  <execution>                      <!--执行目标的标识符,用于标识构建过程中的目标,或者匹配继承过程中需要合并的执行目标-->                      <id></id>                      <!--绑定了目标的构建生命周期阶段,如果省略,目标会被绑定到源数据里配置的默认阶段-->                      <phase></phase>                      <!--配置的执行目标-->                      <goals></goals>                      <!--配置是否被传播到子POM-->                      <inherited></inherited>                      <!--作为DOM对象的配置-->                      <configuration></configuration>                  </execution>              </executions>              <!--项目引入插件所需要的额外依赖-->              <dependencies>                  <!--参见dependency元素配置-->                  <dependency>                  </dependency>              </dependencies>              <!--任何配置是否被传播到子项目-->              <inherited></inherited>              <!--作为DOM对象的配置-->              <configuration></configuration>          </plugin>      </plugins>  </pluginManagement>

repositories远程仓库的配置

很多情况默认的中央仓库无法满足项目需求,需要配置其他远程仓库,如JBoss Maven库,需要在Pom.xml文件中配置。

<repositories>   <repository>    <id>jboss-maven2-release-repository</id>    <name>JBoss Repository</name>    <url>http://repository.jboss.org/maven2/</url>    <releases>     <enabled>true</enabled>     <checksumPolicy>ignore</checksumPolicy>     <updatePolicy>daily</updatePolicy>    </releases>    <snapshots>     <enabled>false</enabled>     <checksumPolicy>fail</checksumPolicy>     <updatePolicy>always</updatePolicy>    </snapshots>    <layout>default</layout>   </repository>  </repositories>

在repositories元素下可以声明一个或多个远程仓库。

id:任何一个仓库声明的id必须是唯一的,Maven自带中央仓库id为central,如果其他仓库声明id也是central,就会覆盖中央仓库的配置。

url:指向仓库的地址,一般该地址是基于http协议,用户可以浏览器中打开仓库地址浏览构件。

releases:支持发布版本下载。

snapshots:支持快照版本下载,enabled=true时开启releases和snapshots还有2个子元素。

checksumPolicy:配置Maven检查检验和文件的策略。当构建被部署到仓库中时,会同时部署对应的校验和文件,在下载构件的时候,Maven会验证校验和文件,如果校验和验证失败,会根据checksumPolicy的值进行选择。默认值是warn-Maven会在执行构建时输出警告信息,可用值还有fail-Maven遇到校验和错误时就让构建失败;ignore-使Maven完全忽略校验和错误。

updatePolicy:配置Maven从远程仓库检查更新的频率,默认值是daily。可用值有daily-每天检查一次、always-每次构建都会检查更新、interval:X-每个X分钟检查一次更新、never-从不检查更新。 layout:值为default表示仓库的布局是Maven2及Maven3的默认布局。

本文由 小马哥 创作,采用 知识共享署名4.0 国际许可协议进行许可 本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名 最后编辑时间为: 2017/11/23 09:23