maven实践

在java的项目中,通常都会使用maven来进行工程的构建。(当然还有另一个竞争者Gradle)
记录一下maven的一些常用用法。

配置文件settings.xml

配置文件存在于两个位置,一般情况下我们应该修改的是用户级别下的配置文件:

  1. 全局级别的$MAVEN_HOME/conf/settings.xml
  2. 用户级别的~/.m2/settings.xml

项目的配置

常规配置

1
2
3
4
5
6
7
<!-- 统一文件编码和JDK版本 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.build.targetEncoding>UTF-8</project.build.targetEncoding>
<maven.compile.source>1.8</maven.compile.source>
<maven.compile.target>1.8</maven.compile.target>
</properties>

仓库配置

maven配置了一个默认的远程仓库,以maven版本3.5.3为例,其定义在配置文件中:
$MAVEN_HOME/lib/maven-model-builder-3.5.3.jar!org/apache/maven/model/pom-4.0.0.xml
如果我们需要配置多个仓库或者覆盖默认的中央仓库,建议把配置定义在项目的pom.xml文件中。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<repositories>
<repository>
<!-- 中央仓库ID,将覆盖了maven默认的中央仓库 -->
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
<!-- maven2或maven3的默认布局,而不是maven1的布局。了解即可 -->
<layout>default</layout>
<snapshots>
<!-- 不允许从该中央仓库中,获取快照版本 -->
<enabled>false</enabled>
<!-- 从远程仓库检查更新的频率 -->
<updatePolicy>always</updatePolicy>
<checksumPolicy>ignore</checksumPolicy>
</snapshots>
</repository>
</repositories>

当我们定义的仓库需要认证时,我们可以在用户级别的settings.xml文件中定义认证信息,例如:

1
2
3
4
5
6
<server>
<!-- 跟repository中的ID一一对应 -->
<id>central</id>
<username>username</username>
<password>userpassword</password>
</server>

仓库的镜像

大家都懂,某些原因我们直接使用默认的中央仓库来获取依赖时,因为maven默认的中央仓库在墙外,下载的速度比较慢,因此我们需要对仓库进行镜像提高拉取速度。在用户级别的settings.xml文件中定义

1
2
3
4
5
6
7
8
<mirror>
<!-- 该镜像的ID,如果需要认证,则配置一个对应的server即可 -->
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<!-- 表示对中央仓库的镜像,任何对于中央仓库的请求都会转至该镜像 -->
<mirrorOf>central</mirrorOf>
</mirror>

项目发布

当我们开发完项目之后,如果需要提供给其他人使用,那么我们就必须把项目打包后,发布到远程仓库中(一般为公司的私服),在项目的pom.xml中定义:

1
2
3
4
5
6
7
8
9
10
11
12
<distributionManagement>
<repository>
<id>corp-releases</id>
<name>Corp Releases</name>
<url>http://xxxxxx/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>corp-snapshots</id>
<name>Corp Snapshot</name>
<url>http://xxxxxx/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>

多模块开发

聚合以及继承

聚合,聚合模块,方便统一进行操作(module)
继承,抽取通用的配置,如依赖、插件等配置(dependencyManagement、pluginManagement)

常用插件

maven-compiler-plugin

统一编译的jdk版本,避免不同环境中jdk版本差异产生的影响。配置如下:

1
2
3
4
5
6
7
8
9
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>${maven.compile.source}</source>
<target>${maven.compile.target}</target>
</configuration>
</plugin>

maven-shade-plugin

生成可执行jar包(java -jar xxx.jar)。配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.juvenxu.mvnbook.helloworld.HelloWorld</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>

maven-source-plugin

生成源码包,配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.0.1</version>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>

多模块下的依赖管理、插件管理

  • 在父项目中,定义dependencyManagement统一管理依赖
  • 在父项目中,定义pluginManagement统一管理插件

常用命令

依赖分析

  • mvn dependency:list
  • mvn dependency:tree
  • mvn dependency:analyze 列出Used undeclared dependencies和Unused declared dependencies

针对模块打包

  • mvn clean -pl <module_name_1>,<module_name_2> -am