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 01:23