使用Maven来构建应用程序,可以非常方便地管理应用相关的资源。众所周知,应用程序中涉及到的一些依赖关系,如Java应用程序依赖jar文件,如果只是手动找到相应的资源,可能需要花费一些时间。而且,即使已经积累了库文件,在未来应用程序升级以后,还要考虑到依赖库文件的升级情况,再次搜索收集。
还有一个问题,对应用程序依赖文件的管理是个非常复杂工作,占用存储空间不说,还可能因为应用之间的版本问题导致依赖冲突。使用Maven的pom模型来构建应用程序,可以更加有效地的管理,而且配置内容非常清晰(有时多了,可能pom文件显得有点臃肿)。
下面将常用的Maven配置,整理如下,以备参考。首先,整理一个简单的目录,作为快速查询之用:
- 设置字符集
- 拷贝src/main/resources/资源文件
- 编译代码
- 、编译打包成jar文件
- 构建测试用例配置
- 输出依赖jar文件到指定目录
- 配置指定的repository
- 将应用及其依赖jar文件打成一个jar文件
具体配置的详细内容,如下所示:
1、设置字符集
1 |
<properties> |
2 |
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> |
3 |
</properties> |
在需要设置字符集的地方,引用${project.build.sourceEncoding}即可。
2、拷贝src/main/resources/资源文件
01 |
<build> |
02 |
<pluginManagement> |
03 |
<plugins> |
04 |
<plugin> |
05 |
<groupId>org.apache.maven.plugins</groupId> |
06 |
<artifactId>maven-resources-plugin</artifactId> |
07 |
<version>2.5</version> |
08 |
<executions> |
09 |
<execution> |
10 |
<id>copy-resources</id> |
11 |
<phase>package</phase> |
12 |
<goals> |
13 |
<goal>copy-resources</goal> |
14 |
</goals> |
15 |
<configuration> |
16 |
<encoding>${project.build.sourceEncoding}</encoding> |
17 |
<outputDirectory>${project.build.directory}</outputDirectory> |
18 |
<resources> |
19 |
<resource> |
20 |
<directory>src/main/resources/</directory> |
21 |
<includes> |
22 |
<include>*.properties</include> |
23 |
<include>*.xml</include> |
24 |
</includes> |
25 |
<filtering>true</filtering> |
26 |
</resource> |
27 |
</resources> |
28 |
</configuration> |
29 |
</execution> |
30 |
</executions> |
31 |
</plugin> |
32 |
</plugins> |
33 |
</pluginManagement> |
34 |
</build> |
3、编译代码
01 |
<build> |
02 |
<pluginManagement> |
03 |
<plugins> |
04 |
<plugin> |
05 |
<groupId>org.apache.maven.plugins</groupId> |
06 |
<artifactId>maven-compiler-plugin</artifactId> |
07 |
<version>2.5</version> |
08 |
<configuration> |
09 |
<source>1.7</source> |
10 |
<target>1.7</target> |
11 |
</configuration> |
12 |
</plugin> |
13 |
</plugins> |
14 |
</pluginManagement> |
15 |
</build> |
可以指定源代码编译级别。
4、编译打包成jar文件
01 |
<build> |
02 |
<pluginManagement> |
03 |
<plugins> |
04 |
<plugin> |
05 |
<groupId>org.apache.maven.plugins</groupId> |
06 |
<artifactId>maven-jar-plugin</artifactId> |
07 |
<executions> |
08 |
<execution> |
09 |
<phase>package</phase> |
10 |
<goals> |
11 |
<goal>jar</goal> |
12 |
</goals> |
13 |
<configuration> |
14 |
<classifier>without-configs</classifier> |
15 |
<excludes> |
16 |
<exclude>*.properties</exclude> |
17 |
<exclude>*.xml</exclude> |
18 |
</excludes> |
19 |
</configuration> |
20 |
</execution> |
21 |
</executions> |
22 |
</plugin> |
23 |
</pluginManagement> |
24 |
</build> |
可以指定打包后jar文件的文件名后缀,同时可以设置是否将配置文件也打包到jar文件中。
5、构建测试用例配置
01 |
<build> |
02 |
<pluginManagement> |
03 |
<plugins> |
04 |
<plugin> |
05 |
<groupId>org.apache.maven.plugins</groupId> |
06 |
<artifactId>maven-surefire-plugin</artifactId> |
07 |
<version>2.9</version> |
08 |
<configuration> |
09 |
<skip>true</skip> |
10 |
<testFailureIgnore>true</testFailureIgnore> |
11 |
</configuration> |
12 |
</plugin> |
13 |
</plugins> |
14 |
</pluginManagement> |
15 |
</build> |
构建应用时,可以配置是否执行测试用例代码,也可以配置如果测试用例未通过是否忽略。
6、输出依赖jar文件到指定目录
01 |
<build> |
02 |
<pluginManagement> |
03 |
<plugins> |
04 |
<plugin> |
05 |
<groupId>org.eclipse.m2e</groupId> |
06 |
<artifactId>lifecycle-mapping</artifactId> |
07 |
<version>1.0.0</version> |
08 |
<configuration> |
09 |
<lifecycleMappingMetadata> |
10 |
<pluginExecutions> |
11 |
<pluginExecution> |
12 |
<pluginExecutionFilter> |
13 |
<groupId>org.apache.maven.plugins</groupId> |
14 |
<artifactId>maven-dependency-plugin</artifactId> |
15 |
<versionRange>[2.0,)</versionRange> |
16 |
<goals> |
17 |
<goal>copy-dependencies</goal> |
18 |
<goal>unpack</goal> |
19 |
</goals> |
20 |
</pluginExecutionFilter> |
21 |
<action> |
22 |
<ignore /> |
23 |
</action> |
24 |
</pluginExecution> |
25 |
</pluginExecutions> |
26 |
</lifecycleMappingMetadata> |
27 |
</configuration> |
28 |
</plugin> |
29 |
</plugins> |
30 |
</pluginManagement> |
31 |
<plugins> |
32 |
<plugin> |
33 |
<groupId>org.apache.maven.plugins</groupId> |
34 |
<artifactId>maven-dependency-plugin</artifactId> |
35 |
<version>2.8</version> |
36 |
<executions> |
37 |
<execution> |
38 |
<id>copy-dependencies</id> |
39 |
<phase>package</phase> |
40 |
<goals> |
41 |
<goal>copy-dependencies</goal> |
42 |
</goals> |
43 |
<configuration> |
44 |
<outputDirectory>${project.build.directory}/lib</outputDirectory> |
45 |
<overWriteReleases>false</overWriteReleases> |
46 |
<overWriteSnapshots>false</overWriteSnapshots> |
47 |
<overWriteIfNewer>true</overWriteIfNewer> |
48 |
</configuration> |
49 |
</execution> |
50 |
</executions> |
51 |
</plugin> |
52 |
</plugins> |
53 |
</build> |
上面,和pluginManagement并列的plugins元素中配置的是拷贝依赖jar文件到target/lib目录下面,如果在Eclipse中出现maven-dependency-plugin (goals “copy-dependencies”, “unpack”) is not supported by m2e错误,上面pluginManagement元素中的配置,可以解决这个错误提示。
7、配置指定的repository
1 |
<repositories> |
2 |
<repository> |
3 |
<id>cloudera</id> |
4 |
<url>https://repository.cloudera.com/artifactory/cloudera-repos/</url> |
5 |
</repository> |
6 |
</repositories> |
如果我们需要要的一些依赖jar文件在maven中央repository中没有,可以在pom文件中配置特定的repository,一般需要配置id和url。
8、将应用及其依赖jar文件打成一个jar文件
01 |
<build> |
02 |
<plugins> |
03 |
<plugin> |
04 |
<artifactId>maven-assembly-plugin</artifactId> |
05 |
<configuration> |
06 |
<archive> |
07 |
<manifest> |
08 |
<mainClass>org.shirdrn.solr.cloud.index.hadoop.SolrCloudIndexer</mainClass> |
09 |
</manifest> |
10 |
</archive> |
11 |
<descriptorRefs> |
12 |
<descriptorRef>jar-with-dependencies</descriptorRef> |
13 |
</descriptorRefs> |
14 |
</configuration> |
15 |
<executions> |
16 |
<execution> |
17 |
<id>make-assembly</id> |
18 |
<phase>package</phase> |
19 |
<goals> |
20 |
<goal>single</goal> |
21 |
</goals> |
22 |
</execution> |
23 |
</executions> |
24 |
</plugin> |
25 |
</plugins> |
26 |
</build> |