Maven常用插件示例

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.jaroriginal-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.csdn.net/waterystone/article/details/43987789

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值