最近经常使用Maven管理工程,于是总结一下使用过的Maven pom.xml配置。我本地使用的Maven版本是apache-maven-3.0.3。工程为普通java application打成jar包形式部署,web工程配置在后面也会做简要介绍。
一、基本配置
- <!-- pom.xml文件以project为根节点 -->
- <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">
- <!-- 声明pom.xml文件所支持的版本 -->
- <modelVersion>4.0.0</modelVersion>
- <!-- 全局性项目唯一标识,通常使用完全限定的包名来和其它项目区分 -->
- <groupId>front</groupId>
- <!-- 在给定的groupId内唯一的产品标识,也是输出的工程名 -->
- <artifactId>front</artifactId>
- <!-- 此项目输出的artifactId的当前版本 -->
- <version>1.0</version>
- <!-- 输出类型:jar、war、ear... -->
- <packaging>jar</packaging>
二、构建配置
- <!-- 项目本地构建文件列表,可以改变文件构建过程 -->
- <profiles>
- <profile>
- <!-- 开发环境配置 -->
- <id>dev</id>
- <!-- 默认执行开发环境配置 -->
- <activation>
- <activeByDefault>true</activeByDefault>
- </activation>
- <properties>
- <!-- 各属性配置,在配置文件中直接使用${}占位即可 -->
- <log.level>TRACE</log.level>
- <!-- ... -->
- </properties>
- </profile>
- <profile>
- <!-- 线上环境配置 -->
- <id>prod</id>
- <properties>
- <log.level>DEBUG</log.level>
- <!-- ... -->
- </properties>
- </profile>
- </profiles>
详情可以参见我的另一篇blog:
结合Commons Configuration和Maven进行工程配置管理 http://shensy.iteye.com/blog/1747408
三、常量
- <!-- 定义一些常量,在项目其他地方可以使用 -->
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <!-- ... -->
- </properties>
四、依赖管理
- <!-- 此项目所有的依赖列表 -->
- <dependencies>
- <dependency>
- <groupId>xxx</groupId>
- <artifactId>xxx</artifactId>
- <version>x.x.x</version>
- <scope>xx</scope>
- </dependency>
- <!-- ... -->
- </dependencies>
五、<build></build>标签内元素
1、资源resources
- <!-- resource的列表,用于包括所有的资源 -->
- <resources>
- <resource>
- <!-- 资源所在的位置 -->
- <directory>${project.basedir}/src/main/resources</directory>
- <!-- 是否替换资源中的属性placehold:${} -->
- <filtering>true</filtering>
- </resource>
- <resource>
- <directory>${project.basedir}/bin</directory>
- <targetPath>${project.build.directory}/bin</targetPath>
- <filtering>true</filtering>
- </resource>
- </resources>
2、插件plugins
- <plugins>
- <!-- 资源插件:用于资源文件管理 -->
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-resources-plugin</artifactId>
- <version>2.5</version>
- <configuration>
- <!-- 资源文件编码 -->
- <encoding>${project.build.sourceEncoding}</encoding>
- </configuration>
- </plugin>
- <!-- 编译插件 -->
- <plugin>
- <artifactId>maven-compiler-plugin</artifactId>
- <version>2.3.2</version>
- <configuration>
- <!-- 源代码jdk编译版本 -->
- <source>1.6</source>
- <!-- 目标平台jdk编译版本 -->
- <target>1.6</target>
- <!-- 字符集编码 -->
- <encoding>UTF-8</encoding>
- <!--编译参数,详见javac命令,此处为控制是否执行注释处理和/或编译.-->
- <compilerArgument>-proc:none</compilerArgument>
- </configuration>
- </plugin>
- <!-- 依赖管理 -->
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-dependency-plugin</artifactId>
- <executions>
- <execution>
- <id>copy-dependencies</id>
- <phase>package</phase>
- <goals>
- <!-- 将所有依赖的jar都拷贝出来 -->
- <goal>copy-dependencies</goal>
- </goals>
- <configuration>
- <outputDirectory>${project.build.directory}/lib</outputDirectory>
- <overWriteReleases>false</overWriteReleases>
- <overWriteSnapshots>false</overWriteSnapshots>
- <overWriteIfNewer>true</overWriteIfNewer>
- </configuration>
- </execution>
- </executions>
- </plugin>
- <!-- jar打包管理 -->
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-jar-plugin</artifactId>
- <configuration>
- <archive>
- <manifest>
- <!-- 往Manifest.MF文件中添加ClassPath -->
- <addClasspath>true</addClasspath>
- <!-- classpath前缀 -->
- <classpathPrefix>lib/</classpathPrefix>
- <!-- 主程序入口 -->
- <mainClass>com.xxx.rest.Application</mainClass>
- </manifest>
- </archive>
- </configuration>
- </plugin>
- <!-- 自定义打包管理 -->
- <plugin>
- <artifactId>maven-assembly-plugin</artifactId>
- <!-- 将maven-assembly-plugin继承到标准的maven打包过程中,
- 在运行maven-package时就会执行maven-assembly-plugin的操作,
- 从而实现我们需要的自定义打包. -->
- <executions>
- <execution>
- <id>distro-assembly</id>
- <phase>verify</phase>
- <goals>
- <goal>single</goal>
- </goals>
- <configuration>
- <!-- 指定maven-assembly-plugin的配置文件 -->
- <descriptors>
- <descriptor>src/main/assembly/assembly.xml</descriptor>
- </descriptors>
- </configuration>
- </execution>
- </executions>
- </plugin>
- <!-- 测试插件 -->
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-surefire-plugin</artifactId>
- <version>2.5</version>
- <configuration>
- <includes>
- <include>**/*Tests.java</include>
- </includes>
- </configuration>
- </plugin>
- <!-- 测试覆盖率插件 -->
- <plugin>
- <groupId>org.codehaus.mojo</groupId>
- <artifactId>cobertura-maven-plugin</artifactId>
- <version>2.5.1</version>
- <configuration>
- <formats>
- <format>xml</format>
- </formats>
- <check></check>
- </configuration>
- <executions>
- <execution>
- <phase>package</phase>
- <goals>
- <goal>cobertura</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- </plugins>
- <!-- 源码包:当使用一个第三方依赖的时候,有时候会希望在IDE中直接进入该依赖的源码查看其实现的细节,如果该依赖将源码包发布到了Maven仓库,那么像Eclipse就能通过m2eclipse插件解析下载源码包并关联到你的项目中,十分方便. -->
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-source-plugin</artifactId>
- <version>2.1.2</version>
- <executions>
- <execution>
- <id>attach-sources</id>
- <phase>verify</phase>
- <goals>
- <goal>jar-no-fork</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
生成Javadoc包:
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-javadoc-plugin</artifactId>
- <version>2.7</version>
- <executions>
- <execution>
- <id>attach-javadocs</id>
- <goals>
- <goal>jar</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
3、finalname
- <finalName>front</finalName>
4、关于自定义打包管理插件maven-assembly-plugin:
将maven-assembly-plugin继承到标准的maven打包过程中,在运行maven-package时就会执行maven-assembly-plugin的操作,从而实现我们需要的自定义打包.上文中将maven-assembly-plugin插件配置文件位置定义在
- src/main/assembly/assembly.xml
中,assembly.xml详细配置如下:
基本配置:
- <assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
- <id>dist</id>
- <!-- 打包的最终格式 -->
- <formats>
- <format>zip</format>
- </formats>
- <includeBaseDirectory>true</includeBaseDirectory>
filesets配置:
- <fileSets>
- <fileSet>
- <!-- ${project.build.directory}/lib打到lib下 -->
- <directory>${project.build.directory}/lib</directory>
- <outputDirectory>lib</outputDirectory>
- <includes>
- <include>**/**</include>
- </includes>
- </fileSet>
- <fileSet>
- <!-- ${project.build.directory}下的jar打到当前路径下,不包含*-sources.jar -->
- <directory>${project.build.directory}</directory>
- <outputDirectory>.</outputDirectory>
- <includes>
- <include>*.jar</include>
- </includes>
- <excludes>
- <exclude>*-sources.jar</exclude>
- </excludes>
- </fileSet>
- <fileSet>
- <!-- bin下的sh文件打到bin路径下 -->
- <directory>${project.build.directory}/bin</directory>
- <outputDirectory>bin</outputDirectory>
- <includes>
- <include>*.sh</include>
- </includes>
- <!-- 最大文件权限 -->
- <fileMode>0777</fileMode>
- <!-- unix结束符 -->
- <lineEnding>unix</lineEnding>
- </fileSet>
- <fileSet>
- <!-- classes下的*.properties,*.xml文件打到conf路径下 -->
- <directory>${project.build.directory}/classes</directory>
- <outputDirectory>conf</outputDirectory>
- <includes>
- <include>*.properties</include>
- <include>*.xml</include>
- </includes>
- <!-- unix结束符 -->
- <lineEnding>unix</lineEnding>
- </fileSet>
- </fileSets>
使用maven-assembly-plugin打包完成后,target路径下回生成一个zip文件,然后就可以直接将zip包上传并解压缩直接部署了。
六、关于web工程[以下节选自网络]:
web配置与jar不同,默认配置package为war。如果需要自定义配置,需要修改插件配置。
任何一个Maven项目都需要定义POM元素packaging(如果不写则默认值为jar)。
该元素决定了项目的打包方式。实际的情形中,如果你不声明该元素,Maven会帮你生成一个JAR包;如果你定义该元素的值为war,那你会得到一个WAR包;如果定义其值为POM(比如是一个父模块),那什么包都不会生成。
Maven为jar项目调用了maven-jar-plugin,为war项目调用了maven-war-plugin,换言之,packaging直接影响Maven的构建生命周期。了解这一点非常重要,特别是当你需要自定义打包行为的时候,你就必须知道去配置哪个插件。
一个常见的例子就是在打包war项目的时候排除某些web资源文件,这时就应该配置maven-war-plugin:
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-war-plugin</artifactId>
- <version>2.1.1</version>
- <configuration>
- <webResources>
- <resource>
- <directory>src/main/webapp</directory>
- <excludes>
- <exclude>**/*.jpg</exclude>
- </excludes>
- </resource>
- </webResources>
- </configuration>
- </plugin>
参考资料:
http://maven.apache.org/guides/getting-started/index.html Maven Getting Started Guide
http://maven.apache.org/plugins/index.html Maven官方常用插件一栏
http://www.infoq.com/cn/news/2011/04/xxb-maven-7-plugin Maven实战系列(七)——常用Maven插件介绍
http://www.infoq.com/cn/news/2011/06/xxb-maven-9-package Maven实战(九)——打包的技巧
http://www.iteye.com/topic/1127097 深入浅出Maven:创建普通及Web项目、使用Profile进行资源过滤
http://snowolf.iteye.com/blog/953735
http://www.blogjava.net/aoxj/archive/2009/01/16/251615.html
http://maven.apache.org/plugins/maven-assembly-plugin/assembly.html