0. resources管理
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.java</include>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.txt</include>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
<testResources>
<testResource>
<directory>src/test/java</directory>
<includes>
<include>**/*.java</include>
</includes>
</testResource>
<testResource>
<directory>src/test/resources</directory>
<includes>
<include>**/*.txt</include>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</testResource>
</testResources>
一.maven-source-plugin
生成源码包,http://maven.apache.org/plugins/maven-source-plugin/。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.2.1</version>
<executions>
<execution>
<id>attach-source</id><!-- 名称随意指定 -->
<phase>package</phase><!-- 要绑定到的生命周期的阶段 -->
<goals>
<goal>jar-no-fork</goal><!-- 要绑定的插件的目标 -->
</goals>
</execution>
</executions>
</plugin>
这样在mvn package后便会在target目录下生成*-sources.jar源码包。
二. maven-javadoc-plugin
生成javadoc文档,http://maven.apache.org/plugins/maven-javadoc-plugin/。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>2.7</version>
<executions>
<execution>
<id>attach-javadocs</id>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
这样在mvn package后便会在target目录下生成*-javadoc.jar文档包。
三. maven-jar-plugin
构建jar项目( 不包含依赖),http://maven.apache.org/plugins/maven-jar-plugin/。只用将pom文件的打包文件设置为jar:<packaging>jar</packaging>,不用再配置maven-jar-plugin,在执行mvn package时默认会在target目录下生成*.jar。
打开mvn-test-0.0.1-SNAPSHOT.jar/META-INF/MANIFEST.MF可看到:
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: xiaoqiang
Build-Jdk: 1.7.0_45
3.2 将资源(resources)打入jar包
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<excludes>
<exclude/>
</excludes>
</configuration>
</plugin>
3.1 将依赖包打到lib下,并生成可执行jar包
<!-- 拷贝依赖的jar包到lib目录 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase><!-- 绑定到package阶段 -->
<goals>
<goal>copy-dependencies</goal><!-- 指定目标 -->
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory><!--将依赖jar包拷贝到指定目录 -->
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath><!-- 设置classPath -->
<classpathPrefix>lib/</classpathPrefix><!-- 设置依赖包的目录 -->
<mainClass>com.adu.mvn_test.HelloWorld</mainClass><!-- 主类 -->
</manifest>
</archive>
</configuration>
</plugin>
这样,mvn clean package后,便会在target下生成mvn-test-0.0.1-SNAPSHOT.jar及lib目录,前者是可执行jar包,后者存放依赖的第三方jar包。
打开mvn-test-0.0.1-SNAPSHOT.jar/META-INF/MANIFEST.MF可看到:
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: xiaoqiang
Build-Jdk: 1.7.0_45
Main-Class: com.adu.mvn_test.HelloWorld
Class-Path: lib/commons-logging-1.1.1.jar lib/log4j-1.2.17.jar
如果eclipse在maven-dependency-plugin的<execution>行报错,则在<bulid>下加如下代码即可:
<pluginManagement>
<plugins>
<!-- 忽略maven-dependency-plugin报的错 -->
<plugin>
<groupId>org.eclipse.m2e</groupId>
<artifactId>lifecycle-mapping</artifactId>
<version>1.0.0</version>
<configuration>
<lifecycleMappingMetadata>
<pluginExecutions>
<pluginExecution>
<pluginExecutionFilter>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<versionRange>[2.0,)</versionRange>
<goals>
<goal>copy-dependencies</goal>
</goals>
</pluginExecutionFilter>
<action>
<ignore />
</action>
</pluginExecution>
</pluginExecutions>
</lifecycleMappingMetadata>
</configuration>
</plugin>
</plugins>
</pluginManagement>
四. maven-compiler-plugin
指定JDK版本和编码
maven 2.1默认用jdk 1.3来编译,maven3 貌似是用jdk 1.5,如果项目用的jdk 1.6也会有问题,compiler插件可以指定JDK版本为1.6。
windows默认使用GBK编码,java项目经常编码为utf8,也需要在compiler插件中指出,否则中文乱码可能会出现编译错误。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<encoding>UTF8</encoding>
</configuration>
</plugin>
五.maven-surefire-plugin
maven是使用surefire插件执行测试的,它按照指定格式的类名来查找匹配的测试类。
默认包含的测试类:
- **/*Test.java
- **/Test*.java
- **/*TestCase.java
默认排除的测试类:
- **/Abstract*Test.java
- **/Abstract*TestCase.java
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.16</version>
<configuration>
<argLine>-Xms128m -Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=256m</argLine><!-- 设置单元测试时虚拟机内存 -->
<includes>
<include>**/*Test.java</include>
</includes>
<excludes>
<exclude>**/TestConstants.java</exclude>
</excludes>
<forkMode>always</forkMode>
</configuration>
</plugin>
forkMode:Maven运行测试用例时,是通过调用maven的surefire插件并fork一个子进程来执行用例的。forkmode属性中指明是要为每个测试创建一个进程,还是所有测试在同一个进程中完成。forkMode可设置值有 “never”, “once”, “always” 和 “pertest”。pretest: 每一个测试创建一个新进程,为每个测试创建新的JVM是单独测试的最彻底方式,但也是最慢的,不适合hudson上持续回归。once:在一个进程中进行所有测试。once为默认设置,在Hudson上持续回归时建议使用默认设置。always:在一个进程中并行的运行脚本,Junit4.7以上版本才可以使用,
使用该插件需要指定如下内容:
<testSourceDirectory>src/test/java</testSourceDirectory>
<testOutputDirectory>target/test-classes</testOutputDirectory>
<testResources>
<testResource>
<directory>src/test/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
<include>**/*.java</include>
</includes>
</testResource>
<testResource>
<directory>src/test/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</testResource>
</testResources>
5.1 跳过单元测试
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
skip=true,表示跳过单元测试,相当于-Dmaven.test.skip=true。
但是在执行mvn test -Dtest时,也会被跳过。解决方法是用excludes跳过所有测试,而不是用skipTests.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.16</version>
<configuration>
<!-- <skipTests>true</skipTests> -->
<excludes>
<exclude>**/*.java</exclude>
</excludes>
</configuration>
</plugin>
即跳过所有test。这样再执行mvn test -Dtest就没有问题了。
六. maven-shade-plugin
构建包含依赖的jar包,http://maven.apache.org/plugins/maven-shade-plugin/。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.4</version>
<executions>
<execution>
<phase>package</phase><!-- 要绑定到的生命周期的阶段 -->
<goals>
<goal>shade</goal><!-- 要绑定的插件的目标 -->
</goals>
<configuration>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.adu.mvn_test.HelloWorld</mainClass><!-- 指定可执行jar包的主程序入口 -->
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
mvn clean package后,target下可以看到 mvn-test-0.0.1-SNAPSHOT.jar和 original-mvn-test-0.0.1-SNAPSHOT.jar两个jar包,前者是带有依赖包(会解压)和Main-Class信息的可运行jar包,后者是原始的jar包(不包含依赖及Main-Class信息)。
打开mvn-test-0.0.1-SNAPSHOT.jar/META-INF/MANIFEST.MF可看到Main-Class: com.adu.mvn_test.HelloWorld信息。
可运行jar包的执行:$java -jar mvn-test-0.0.1-SNAPSHOT.jar 或者直接双击。
七.maven-assembly-plugin
构建自定义格式的分发包,http://maven.apache.org/plugins/maven-assembly-plugin/。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2</version>
<configuration>
<archive>
<manifest>
<mainClass>com.adu.mvn_test.HelloWorld</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>
jar-with-dependencies
</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
这样mvn assembly:assembly后,便会在target目录下生成mvn-test-0.0.1-SNAPSHOT-jar-with-dependencies.jar,即是带有依赖包(会解压)和Main-Class信息的可运行jar包。
7.1 assembly绑定到package阶段
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2</version>
<executions>
<execution>
<id>make-assembly</id><!-- 名称随意指定 -->
<phase>package</phase><!-- 绑定到pakcage阶段 -->
<goals>
<goal>single</goal><!-- 插件目标 -->
</goals>
</execution>
</executions>
<configuration>
<archive>
<manifest>
<mainClass>com.adu.mvn_test.HelloWorld</mainClass><!--主类 -->
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>
jar-with-dependencies<!-- 带依赖 -->
</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
这样,mvn package即可达到上面的结果。
7.2 不解压到目标jar包
默认assembly会将依赖的jar包解压到目标jar包里,如果想不解压,可用如下配置。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2</version>
<configuration>
<descriptors>
<descriptor>src/main/resources/assembly.xml</descriptor>
</descriptors>
</configuration>
</plugin>
assembly.xml的内容如下:
<assembly>
<id>jar-with-dependencies</id>
<formats>
<format>jar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<unpack>false</unpack><!--不解压 -->
<scope>runtime</scope>
</dependencySet>
</dependencySets>
</assembly>
但是这种方法,运行jar的时候一直提示找不到主类,正在解决中。。。。。
转载请注明:http://blog.youkuaiyun.com/waterystone/article/details/43987789