使用Maven有一段时间了,用它做过几个项目的构建工具,感觉还是非常不错的,省去很多不必要的麻烦,比如jar包的依赖管理,升级等,还可以处理一些繁杂的事务,比如简单的代码生成,数据导入导出等。当然这里有一定的学习成本!
本文就一些常规使用做了介绍,包括一些需要注意的地方和本人常人的配置插件等。
特别说明,由于settings.xml是针对全局或个人的设置,不能随项目走,所以本文直接无视settings.xml的配置!
.
pom.xml
src
|-main
|-java
|-resources
|-webapp
|-test
|-java
|-resources
target
加*项是建项目必要属性
属性名称 | 描述 |
---|---|
groupId * | 当前项目隶属的上级项目ID,一般是系列相关子项目的组ID,如:org.springframework |
artifactId * | 当前项目模块ID,一般为实际项目ID,如:spring-web |
version * | 此项目模块的版本 |
packaging | 项目类型,jar或war,默认为jar |
name | 项目名称,如果跟IDE配合使用时IDE会识别此名称 |
description | 项目描述 |
organization | 所属组织 |
licenses | 许可协议 |
mailingLists | 邮件列表 |
developers | 开发者 |
contributors | 贡献者 |
issueManagement | 问题追踪系统 |
ciManagement | 持续集成系统 |
scm | 版本控制系统 |
名称 | 说明 |
---|---|
${basedir} | 项目根目录,包含pom.xml文件的目录 |
${version} | 项目的版本 |
${pom.build.sourceDirectory} | 项目的主源码目录,默认为:src/main/java |
${pom.build.testSourceDiretory} | 项目的测试源码目录, 默认为:src/test/java |
${pom.build.directory} | 项目构建输出目录,默认为target |
${pom.outputDirectory} | 项目主代码编译输出目录,默认为: target/classess |
${pom.testOutputDirectory} | 项目主代码编译输出目录,默认为: target/test-classess |
${pom.groupId} | 项目的groupId |
${pom.artifactId} | 项目的artifactId |
${pom.version} | 项目的版本 |
${pom.build.finalName} | 项目打包输出文件的名称,默认为${pom.artifactId}-${pom.version} |
以上build属性可通过pom.xml文件中build结点指定如:
<build>
<directory>${pom.basedir}/target</directory>
<outputDirectory>${pom.build.directory}/classes</outputDirectory>
<finalName>${pom.artifactId}-${pom.version}</finalName>
<testOutputDirectory>${pom.build.directory}/test-classes</testOutputDirectory>
<sourceDirectory>${pom.basedir}/src/main/java</sourceDirectory>
<scriptSourceDirectory>src/main/scripts</scriptSourceDirectory>
<testSourceDirectory>${pom.basedir}/src/test/java</testSourceDirectory>
<resources>
<resource>
<directory>${pom.basedir}/src/main/resources</directory>
</resource>
</resources>
<testResources>
<testResource>
<directory>${pom.basedir}/src/test/resources</directory>
</testResource>
</testResources>
<build>
更多内容:MavenPropertiesGuide
在根结点增加:
<projecties>
<spring.version>3.1-RELEASE</spring.version>
<hibernate.version>4.2-FINAL</hibernate.version>
<!-- 使用${spring.version}读取 -->
</projecties>
如有文件 src/main/resources/application.properties
:
# application.properties
application.name=${pom.name}
application.version=${pom.version}
执行命令:mvn process-resources
maven会给其中的亦是赋值:
# application.properties
application.name=Maven Quick Start Archetype
application.version=1.0-SNAPSHOT
更多内容:http://maven.apache.org/guides/getting-started/index.html#How_do_I_filter_resource_files
如在maven的中央仓库中没有你要用的jar包,通过自定义源解决:
<repositories>
<repository>
<id>central</id>
<name>Maven Repository Switchboard</name>
<layout>default</layout>
<url>http://repo1.maven.org/maven2</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<dependency>
<!-- 子项目,被依赖的子项目必须经过maven的install安装,不然maven还是找不到! -->
<groupId>bgonline</groupId>
<artifactId>foundation</artifactId>
<version>1.0.0</version>
<!-- 排除 -->
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
##安装jar文件
call mvn install:install-file -Dfile=xxx-1.0.0.jar -DgroupId=com.xx -DartifactId=xx -Dversion=1.0.0 -Dpackaging=jar
##安装pom文件
call mvn install:install-file -Dfile=xxx-1.0.0.pom.xml -DgroupId=com.xx -DartifactId=xx -Dversion=1.0.0 -Dpackaging=pom
<build>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.3</version>
</plugin>
</plugins>
</pluginManagement>
</build>
<pluginRepositories>
<pluginRepository>
<id>central</id>
<name>Maven Plugin Repository</name>
<url>http://repo1.maven.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<updatePolicy>never</updatePolicy>
</releases>
</pluginRepository>
</pluginRepositories>
名称 | 说明 |
---|---|
jetty-maven-plugin | jetty插件,轻量级web容器,推荐阶段开发使用 |
maven-antrun-plugin | 跑ant命令插件,常用来做文件处理,sql执行等,基本包括ant所有功能 |
native2ascii-maven-plugin | 转ascii,如多语言配置文件的中文转成ascii码解决乱码问题 |
versions-maven-plugin | 检测所有依赖的更新情况 |
maven-surefire-plugin | 生成测试报告,配全Testng,指定单元测试的配置文件,进行分组、分类、分包测试,可参考Testng文档说明 |
更多内容:plugins
有时候会根据不同的情况执行不现的构建命令,这就用到maven的profile,profile可以直接写在pom.xml里也可以被提出到独立文件profiles.xml同pom.xml同级目录或settings.xml,但Maven3只支持写在pom.xml文件里,why?!
1.使用profile+ant执行sql做数据初始化:
<profile>
<id>INIT-DB-DATA</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<configuration>
<target>
<sql driver="${jdbc.driver}" url="${jdbc.url}" userid="${jdbc.username}" password="${jdbc.password}" onerror="continue">
<classpath refid="maven.runtime.classpath"/>
<transaction src="src/main/resources/sql/${jdbc.direct}/schema.sql"/>
</sql>
</target>
</configuration>
</plugin>
</plugins>
</build>
</profile>
2.使用maven profile ant hibernate-tools生成类bean:
<profile>
<id>Gen-Java-Bean</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<configuration>
<target>
<echo message="生成表ENTITY类……"/>
<property name="toolsDir" value="src/test/tools"/>
<!-- 这里需要指定hibernatetool相关jar包,自行下载 -->
<path id="lib.class.path">
<fileset dir="${toolsDir}/lib">
<include name="*.jar"/>
</fileset>
</path>
<taskdef name="hibernatetool" classname="org.hibernate.tool.ant.HibernateToolTask" classpathref="lib.class.path"/>
<hibernatetool destdir="${toolsDir}/lib/build">
<jdbcconfiguration propertyfile="${toolsDir}/lib/cfg/jdbc.properties" revengfile="${toolsDir}/lib/cfg/hibernate.reveng.xml"/>
<!-- 指定hibernatetools生成bean的模板,根据自己需要定制生成内容,用的freemarker引擎,在hibernate-tools.jar包里有默认模板 -->
<hbmtemplate
destdir="${toolsDir}/lib/build"
templatepath="${basedir}/${toolsDir}/lib/hbmtemplates/"
templateprefix="/hbmtemplates"
filepattern="{class-name}Entity.java"
template="pojo2/Pojo.ftl">
<property key="ejb3" value="false"/>
<property key="jdk5" value="false"/>
</hbmtemplate>
<!-- 或者直接 <hbm2java/> 只是这样使用的是默认模板 -->
</hibernatetool>
</target>
</configuration>
</plugin>
</plugins>
</build>
</profile>
更多内容:profiles.html
创建如下目录结构:
+- pom.xml 父
+- my-app
| +- pom.xml 子1,jar类型
| +- src
| +- main
| +- java
+- my-webapp
| +- pom.xml 子2,webapp类型
| +- src
| +- main
| +- webapp
父pom内容如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>app</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>my-app</module>
<module>my-webapp</module>
</modules>
</project>
注:一些项目全局属性可在此pom文件中设置,比如项目信息,所有依赖等,这样在子项目就不用重复申明,如依赖可省掉版本号,直接使用父pom中的版本,这样可以统一管理所有项目的依赖版本。
子1的pom内容如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<groupId>com.mycompany.app</groupId>
<artifactId>app-jar</artifactId>
<packaging>jar</packaging>
<parent>
<groupId>com.mycompany.app</groupId>
<artifactId>app</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
...
子2的pom内容如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<groupId>com.mycompany.app</groupId>
<artifactId>app-war</artifactId>
<packaging>war</packaging>
<parent>
<groupId>com.mycompany.app</groupId>
<artifactId>app</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
...
子2需要依赖子1,配置如下:
...
<dependencies>
<dependency>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
...
</dependencies>
最后在父pom所在目录执行mvn clean install
命令,jar包会被安装本地仓库,war会被发布到target目录。
mvn archetype:generate \
-DarchetypeGroupId=org.apache.maven.archetypes \
-DgroupId=com.mycompany.app \
-DartifactId=my-app
生成的目录结构:
my-app
|-- pom.xml
`-- src
|-- main
| `-- java
| `-- com
| `-- mycompany
| `-- app
| `-- App.java
`-- test
`-- java
`-- com
`-- mycompany
`-- app
`-- AppTest.java
mvn archetype:generate \
-DarchetypeGroupId=org.apache.maven.archetypes \
-DarchetypeArtifactId=maven-archetype-webapp \
-DgroupId=com.mycompany.app \
-DartifactId=my-webapp
生成的目录结构:
+- my-webapp
| +- pom.xml
| +- src
| +- main
| +- resources
| +- webapp
| +- index.jsp
| +- WEB-INF
| +- web.xml
之后根据需要在main下创建java目录,在src创建test目录。
mvn compile
,编译测试 mvn test-compile
,不执行测试,仅编译mvn test
,执行测试mvn package
,java项目打成jar包,web项目打包war包mvn install
,将自己java项目生成的jar包安装到本地仓库mvn site
,根据pom.xml配置信息生成项目相关的站点在target/sitemvn clean
,将target目录下build后的内容删除更多内容:lifecycle.html
POM详细说明文档 :http://maven.apache.org/pom.html
POM说明3.0.5版:http://maven.apache.org/ref/3.0.5/maven-model/maven.html
Maven-3.0.5文档:http://maven.apache.org/ref/3.0.5/
maven.apache.org:http://maven.apache.org/guides/getting-started/
docs.codehaus.org:http://docs.codehaus.org/display/MAVENUSER