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

/ maven / 没有评论 / 1540浏览

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

-----------------来自小马哥的故事

xxx

四种 Maven 项目创建方式

手动方式构建

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

动态web的Maven项目的目录约定如下图所示: 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项目结构如下:

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),选择编译环境即可。

Maven项目目录结构

完成后目录结构如下:

eclipse创建Maven项目2

Idea IDE

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

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

IDEA创建Maven项目1

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

IDEA创建Maven项目2

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

IDEA创建Maven项目3

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

IDEA创建Maven项目4

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产生实际的影响。

Maven的依赖范围

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的默认布局。