一个parent-pom例子:
maven中央仓库地址:http://mvnrepository.com/
maven是一个项目构建工具,依赖管理工具,项目信息管理工具.大大简化了我们的开发工作.
最佳实践是,将M2_HOME
下面conf下面的settings.xml
复制到~/.m2/下面,并且修改相应的配置信息.
###maven安装与基本配置
有时候你的公司基于安全考虑,要求你使用安全代理访问互联网,这时候,需要为MAVEN配置HTTP代理,才能让他访问外部仓库,以下载所需要的资源.
proxies下可以有多个proxy元素,但是默认第一个被激活的proxy会生效,可以用|来分割多个主机.nonProxyHosts
用来指定哪些主机名不需要代理.
安装m2eclipsehttp://download.eclipse.org/technology/m2e/releases/
MAVEN安装最佳实践
- 设置MAVEN_OPTS环境变量
通常设置为-Xms128m -Xms512m
,因为java默认的最大可用内存往往不能够满足Maven运行的需要. - 配置用户范围的
settings.xml
M2_HOME/conf/settings.xml
是全局范围的,~/.m2/settings.xml
是用户范围的.在用户目录下. - 不要使用IDE内嵌的maven
maven使用入门
编写POM
|
|
编写测试代码
因为maven的核心插件之一-compile默认只支持java1.3.所以配置插件使其支持java1.5.
test命令:mvn clean test
####打包和运行
编译:mvn clean compile
打包:mvn clean package
如果需要别的项目可以引用该项目则需要一个安装的步骤:mvn clean install
有main
方法的项目打包生成的默认jar包是不能直接运行的,因为带有main
方法的类信息不会添加到manifest
中(打开jar文件中的META-INF/MANIFEST.MF
文件,将无法看到Main-Class
一行).为了生成可执行的jar文件,需要借助maven-shade-plugin
,配置该插件如下:
现在在target目录下有2个jar.一个是原始的,一个是可以直接运行的.
到项目目录下执行:java -jar target\hello-world-1.0-SNAPSHOT.jar
会执行main方法,看到结果.
####使用Archetype生成项目骨架mvn archetype:generate
依赖范围
依赖范围就是用来控制依赖与这三种classpath(编译classpath,测试calsspath,运行classpath)的关系,maven有以下几种依赖范围:
- compile:编译依赖范围,默认情况下是这个,此种范围,对编译,测试,运行都有效.如
spring-core
. - test:测试依赖范围,只用于测试classpath.在编译和运行时无法使用此依赖.典型的例子是
Junit
. - provided:已提供依赖范围.这种只对编译和测试有效,运行时无效.典型的例子是
servlet-api
,编译和测试项目的时候需要该依赖,但是运行时由于容器已经提供,就不需要maven重复的引入一遍. - runtime:运行时依赖范围.此种只对测试和运行时有效.但在编译主代码时无效,典型的例子是
jdbc
驱动实现,项目主代码的编译只需要jdk提供的jdbc接口,只有在执行测试或者运行项目的时候才需要实现上述接口的具体jdbc驱动. - system:系统依赖范围.该依赖与三种classpath的关系和provided依赖范围完全一致.但是需要使用systemPath显式指定依赖位置,造成构建的不可移植性,因此谨慎使用.
- import(maven2.0.9及以上):导入依赖范围.该依赖范围不会对3种classpath产生实际的影响.
优化依赖
查看所有依赖:mvn dependency:list
查看依赖树:mvn dependency:tree
分析依赖查找潜在风险:mvn dependency:analyze
maven仓库
中央仓库
maven安装时自带了中央仓库的默认配置,通过解压$M2_HOME/lib/maven-model-builder-3.3.3.jar
,然后访问org\apache\maven\model\pom-4.0.0.xml
,可以看到下面的配置:
这是所有maven项目都会继承的超级POM,false表示不从该仓库下载快照版本的构件.
私服
私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的Maven用户使用.当maven需要下载构件的时候,它从私服请求,如果私服上不存在该构件,则从外部的远程仓库下载,缓存在私服上之后,再供请求使用.另外,一些无法从外部仓库下载的构件也能从本地上传到私服上供大家使用.
私服可以帮你:
- 节省自己的外网带宽.
- 加速maven构建.
- 部署第三方构件.
- 提高稳定性,增强控制.
- 降低中央仓库的负荷.
远程仓库的配置
|
|
在repositories
下面,可以使用repository
声明一个或多个远程仓库,id都是唯一的,Maven自带的中央仓库的id为central
,所以自己配置的不能和central同名,否则会覆盖中央仓库的配置.
该配置例子中的,releases
和snapshots
元素比较重要,它们用来控制maven对发布版构件和快照版构件的下载.
例子中maven只会从jboss下载发布版的构件,而不会下载快照版的.
####远程仓库的认证
大部分远程仓库无需认证就可以访问,但是一般组织内部的maven服务器因为安全考虑会为用户配置一组用户名和密码.
部署至远程仓库
|
|
往远程仓库部署构件的时候.需要认证.认证的方式是在settings.xml
中创建一个server元素,其id与仓库的id匹配,并配置正确的认证信息.从远程下载个部署,认证配置的方式是一样的.
配置正确后,执行mvn clean deploy
,maven就会将项目构建输出的构件部署到对应的远程仓库.
####镜像
如果仓库x可以提供仓库y存储的所有内容,那么就可以认为x是y的一个镜像.
mirrorOf
为’central’,表示对于中央仓库central的请求都会转至该镜像.
但是更常见的镜像配置是结合私服:
生命周期和插件
生命周期
maven生命周期介绍:http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html
maven拥有三套相互独立的生命周期,它们分别为clean
,default
,site
.clean
生命周期的目的是清理项目,default
生命周期的目的是构建项目,site
生命周期的目的是建立项目站点.每个生命周期包含一些阶段,这些阶段是有顺序的,并且后面的阶段依赖前面的阶段,用户和maven最直接的交互方式是调用这些生命周期的阶段.
这三个阶段是相互独立的,例如,当用户调用clean
生命周期的clean
阶段时,不会触发default
生命周期的任何阶段.
#####clean生命周期
这个阶段主要工作是清理项目,它包含三个阶段:
pre-clean
执行一些清理前需要完成的工作.clean
清理上一次构建生成的文件.post-clean
执行一些清理后需要完成的工作.
#####default生命周期site生命周期
####插件
#####命令行插件配置:
很多插件的目标参数都支持从命令行配置,用户可以在maven命令中使用-D参数,并伴随一个参数键=参数值的形式,来配置插件目标的参数.
例如,maven-surefire-plugin
提供了一个maven.test.skip
参数,当其值为true
的时候,就会跳过执行测试.$ mvn install -Dmaven.test.skip=true
参数D是java自带的,其功能是通过命令行设置一个java系统属性,maven简单的重用了该参数,在准备插件的时候检查系统属性,便实现了插件参数的配置.
插件自定义绑定到pom.xml示例:(自定义将某个插件目标绑定到生命周期的某个阶段上)http://maven.apache.org/components/plugins/maven-source-plugin/usage.html
tips:
- 插件列表:
http://maven.apache.org/components/plugins/
- 可以使用
maven-help-plugin
查看插件详细信息,了解插件目标的默认绑定阶段.$ mvn help:describe-Dplugin=org.apache.maven.plugins:maven-source-plugin:2.1.1-Ddetail
- maven生命周期介绍:
http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html
#####pom中插件全局配置123456789<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.1</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin>
mvn -h
显示命令行帮助:
|
|
```