本文共 6717 字,大约阅读时间需要 22 分钟。
Apache Maven,是一个软件(特别是java软件)项目及自动构建工具,由Apache软件基金会所提供。基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构建、测试报告和文档等。
maven有规定好的目录结构,项目必须严格遵从。一个 maven 项目在默认情况下会产生 JAR 文件,另外 ,编译后 的 classes 会放在 ${basedir}/target/classes 下面, JAR 文件会放在${basedir}/target 下面。
目录 | 作用 |
${basedir} | 存放 pom.xml和所有的子目录 |
${basedir}/src/main/java | 项目的 java源代码 |
${basedir}/src/main/resources | 项目的资源,比如说 property文件 |
${basedir}/src/test/java | 项目的测试类,比如说 JUnit代码 |
${basedir}/src/test/resources | 测试使用的资源 |
一,maven配置文件
全局配置文件:{installed_dir}/conf/settings.xml
优先级更高的配置文件:${user.home}/.m2/settings.xml
二,maven本地和远程仓库
本地仓库是远程仓库的一个缓冲和子集,当你构建Maven项目的时候,首先会从本地仓库查找资源,如果没有,那么Maven会从远程仓库下载到你本地仓库。这样在你下次使用的时候就不需要从远程下载了。如果你所需要的jar包版本在本地仓库没有,而且也不存在于远程仓库,Maven在构建的时候会报错,这种情况可能发生在有些jar包的新版本没有在Maven仓库中及时更新。
1,自定义的本地仓库路径
如下配置,在setting.xml文件中,本地仓库有默认配置,在${user.home}/.m2/repository目录中。
<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
-->
当然,我们可以在settings.xml中自定义本地仓库,加入以下字段即可:
<localRepository>/opt/java/repo</localRepository>
也可以通过命令行的模式指定本地仓库:(不推荐这么做)
# mvn clean install -Dmaven.repo.local=/home/juven/myrepo/
2,自定义远程仓库
默认远程仓库配置:
在apache-maven-3.0.4/lib/maven-model-builder-3.0.4.jar文件中org/apache/maven/model/pom-4.0.0.xml文件中定义了中央仓库:
<repositories>
<repository>
<id>central</id>
<name>Central Repository</name>
<url>http://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>central</id>
<name>Central Repository</name>
<url>http://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<updatePolicy>never</updatePolicy>
</releases>
</pluginRepository>
</pluginRepositories>
setting.xml配置文件中定义远程仓库,优先级高,配置如下:
pom.xml的作用范围限于一个项目, 但一个公司/组织通常不只开发一个项目,那么为了避免重复配置,那么我们可以把一些公共配置放在${MAVEN_HOME}/conf/setting.xml(或${user.home}/.m2/setting.xml中。下面是在setting.xml中配置一个远程仓库的例子.
<settings>
<profiles> <profile> <!-- 其他profile --> </profile> <profile> <id>myProfiel</id> <!-- 在这里加入<repositories>及<pluginRepositories> --> </profile> </profiles> <!-- 声明哪些profile被激活,或根据某些条件激活 --> <activeProfiles> <activeProfile>myProfiel</activeProfile> </activeProfiles> </settings>这里通过<activeProfile>元素来激活这个profile,这样我们就可以全局的使用这个配置,不再需要为每个POM做重复的配置了(也可以针对特定的条件激活,比如某些profile只有在使用JDK 1.4时才生效)。
在实际的操作过程中,setting.xml配置的远程仓库,可以是通过nexus建立的公司自己的仓库。
pom.xml文件定义远程仓库,优先级最高,配置如下:
<repositories>
<repository>
<id>Nexus</id>
<name>Nexus Public Repository</name>
<url>http://maven.test.sohu.com/nexus/content/groups/public</url>
</repository>
<repository>
<id>nexus-snapshots</id>
<name>Nexus Snapshot Repository</name>
<url>http://maven.test.sohu.com/nexus/content/repositories/snapshots</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
在pom中允许配置多个repository和 plugin repository,其中<snapshots><enabled>true</enabled</snapshots>
告诉Maven可以从这个仓库下载snapshots版本的构件。而如果有<snapshots><enabled>false</enabled></snapshots>这样的配置,则告诉Maven不要从这个仓库下载snapshot版本的构件。
Maven在使用第三方构件和插件时是分开来配置的,所以如果我们也希望插件的下载也通过我们自己的仓库来下载,那么我们就需要配置pluginRepository.至于<pluginRepositories>,这是配置Maven从什么地方下载插件构件,Maven的所有行为都是通过插件来完成的。 <pluginRepository>的配置与<repository>类似。
三,maven发布jar包到nexus服务器
1),在pom.xml文件中可以定义如下代码:
<distributionManagement>
<repository> <id>nexus-releases</id> <name>Nexus Release Repository</name> <url>http://maven.test.sohu.com/nexus/content/repositories/releases</url> </repository> <snapshotRepository> <id>nexus-snapshots</id> <name>Nexus Snapshot Repository</name> <url>http://maven.t.sohu.com/nexus/content/repositories/snapshots</url> <uniqueVersion>false</uniqueVersion> </snapshotRepository> </distributionManagement>2)确保Nexus服务器的Releases仓库属性正确。
进入Nexus控制台,用admin登录。点开“Views/Repositories”选“Repositories”,在Repositories列表中选择Releases,点configuration,Deployment Policy默认为“Disable Redeploy”,点击修改为“Allow Redeploy”并保存。
3)修改用户目录下的settings.xml文件。
settings.xml文件路径为${user.home}/.m2或%{m2_home}/conf/。Windows7系统目录为C:/Users/用户名/.m2。
找到<servers>,然后修改信息如下:
<servers> <server> <id>releases</id> <username>deployment</username> <password>deployment</password> </server> </servers>注意:server的id必须和第1)点中的repository的id一致。用户名最好用deployment。
4)重新设定用户deployment的密码。
进入Nexus控制台,点开Security选Users,在用户列表中右键点击deployment用户,选Set Password重新设定deployment的密码为“deployment”,当然也可设置为其他,只要与第3)点server配置一致即可。
5)在工程主目录下(POM文件所在目录)运行“mvn deploy:deploy”即能实现版本的构建和发布。
四,maven使用assembly实现自定义打包
pom.xml中设置如下:
<build>
<plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <!-- not append assembly id in release file name --> <appendAssemblyId>false</appendAssemblyId> <descriptors> <descriptor>src/main/assemble/package.xml</descriptor> </descriptors> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build>其中<artifactId>maven-assembly-plugin</artifactId>的maven-assembly-plugin是这个插件的标准命名,在maven2.0.*中带的默认版本是
appendAssemblyId属性控制是否在生成的打包文件的文件名中包含assembly id。
descriptor属性指定maven-assembly-plugin的配置文件,当然我设置的是src/main/assemble/package.xml.容许使用多个,功能强大当然用法也复杂,对于简单情况一个足矣。
execution的设置是为了将maven-assembly-plugin继承到标准的maven打包过程中,这样在运行命令mvn package时就会执行maven-assembly-plugin的操作,从而实现我们需要的自定义打包,这样就不用再去执行mvn assembly:assembly指令了。
五,maven的常用命令和参数、
1,常用参数
mvn -e 显示详细错误
mvn -U 强制更新snapshot类型的插件或依赖库(否则maven一天只会更新一次snapshot依赖) mvn -o 运行offline模式,不联网更新依赖 mvn -N 仅在当前项目模块执行命令,关闭reactor mvn -pl module_name在指定模块上执行命令 mvn -ff 在递归执行命令过程中,一旦发生错误就直接退出mvn -Dxxx=yyy指定java全局属性
mvn -Dwtpversion=2.0 指定maven版本
mvn -Dmaven.test.skip=true 如果命令包含了test phase,则忽略单元测试 mvn -DuserProp=filePath 指定用户自定义配置文件位置 mvn -DdownloadSources=true -Declipse.addVersionToProjectName=true eclipse:eclipse 生成eclipse项目文件,尝试从仓库下载源代码,并且生成的项目包含模块版本(注意如果使用公用POM,上述的开关缺省已打开)mvn -Pxxx引用profile xxx。profile的定义在pom.xml文件中,一般id为test或者product,一个是测试环境的配置,一个是线上环境的配置。配置如下:
<profiles>
<profile>
<id>test</id>
<properties>
<env>test</env>
</properties>
</profile>
<profile>
<id>product</id>
<properties>
<env>product</env>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
</profiles>
2,常用命令
mvn compile 编译生成class文件
mvn test 运行程序中的单元测试
mvn clean 移除所有上一次构建生成的文件(例如test和target目录)
mvn package 打包编译后的代码,在target目录下生成package文件,默认会生成jar文件,如果有自定义打包策略,可以生成zip等类型文件。需要的依赖文件,会先从本地仓库找(linux默认为~/.m2/repository/),没有的话,再从远处仓库download
mvn install 在本地Repository中安装jar,方便本地其它项目使用。默认是安装打好的包到server的本地mvn仓库中,linux默认为~/.m2/repository/
常用的打包命令:
# mvn -U -Dmaven.test.skip=true -P test -f pom.xml clean package install