Maven自动化构建

  |  

摘要: 本文介绍了 Maven 的自动化构建。

【对算法,数学,计算机感兴趣的同学,欢迎关注我哈,阅读更多原创文章】
我的网站:潮汐朝夕的生活实验室
我的公众号:算法题刷刷
我的知乎:潮汐朝夕
我的github:FennelDumplings
我的leetcode:FennelDumplings


自动化构建的场景

自动化构建定义了这样一种场景: 在一个项目成功构建完成后,其相关的依赖工程即开始构建,这样可以保证其依赖项目的稳定。

例子:一个团队正在开发一个项目 bus-core-api,并且有其他两个项目 app-web-ui 和 app-desktop-ui 依赖于这个项目。

app-web-ui 项目使用的是 bus-core-api 项目的 1.0 快照:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<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">
<modelVersion>4.0.0</modelVersion>
<groupId>app-web-ui</groupId>
<artifactId>app-web-ui</artifactId>
<version>1.0</version>
<packaging>jar</packaging>

<dependencies>
<dependency>
<groupId>bus-core-api</groupId>
<artifactId>bus-core-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>

app-desktop-ui 项目使用的也是 bus-core-api 项目的 1.0 快照:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<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">
<modelVersion>4.0.0</modelVersion>
<groupId>app-desktop-ui</groupId>
<artifactId>app-desktop-ui</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>bus-core-api</groupId>
<artifactId>bus-core-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>

bus-core-api 项目:

1
2
3
4
5
6
7
8
9
10
<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">
<modelVersion>4.0.0</modelVersion>
<groupId>bus-core-api</groupId>
<artifactId>bus-core-api</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
</project>

现在 app-web-ui 和 app-desktop-ui 项目的团队要求不管 bus-core-api 项目何时变化,他们的构建过程都应当可以启动。

使用快照可以确保最新的 bus-core-api 项目被使用,但要达到上面的要求,我们还需要做一些额外的工作。

可以使用两种方式:

  • 在 bus-core-api 项目的 pom 文件中添加一个 post-build 目标操作来启动 app-web-ui 和 app-desktop-ui 项目的构建。
  • 使用持续集成(CI)服务器,比如 Hudson、Jenkins 等,来自行管理构建自动化。
  • 使用脚本也可以实现。

本文我们只看一下 Maven 自动化构建的做法。

Maven 自动化构建

创建目录 MVN/Maven-Build-Automation,和 MVN/Maven-Build-Automation/projects。

在 MVN/Maven-Build-Automation/ 下创建 bus-core-api 项目,在 MVN/Maven-Build-Automation/ 下创建 app-web-ui 和 app-desktop-ui 项目。

目录结构如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
├─bus-core-api
│ ├─pom.xml
│ ├─src
│ │ ├─main
│ │ │ └─java
│ │ └─test
│ │ └─java
│ └─target
└─projects
├─app-desktop-ui
│ ├─pom.xml
│ ├─src
│ │ ├─main
│ │ │ └─java
│ │ └─test
│ │ └─java
│ └─target
└─app-web-ui
├─pom.xml
├─src
│ ├─main
│ │ └─java
│ └─test
│ └─java
└─target

此后 bus-core-api、app-web-ui、app-desktop-ui 下的 pom.xml 在前面的基础上均有所修改,下面分别看一下。

app-web-ui/pom.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<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">
<modelVersion>4.0.0</modelVersion>
<groupId>app-web-ui</groupId>
<artifactId>app-web-ui</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<name>网页 UI</name>
<description>app-web-ui 依赖 bus-core-api</description>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<dependencies>
<dependency>
<groupId>bus-core-api</groupId>
<artifactId>bus-core-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>system</scope>
<systemPath>/home/ppp/codes/java/MVN/Maven-Build-Automation/bus-core-api/target/bus-core-api-1.0-SNAPSHOT.jar</systemPath>
</dependency>
</dependencies>
</project>

这里设置 bus-core-api 项目依赖为本地依赖。其中 之间为 bus-core-api 项目生成的 jar 包最终存放位置。

app-desktop-ui/pom.xml

设置与前面的 app-web-ui 几乎一样。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<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">
<modelVersion>4.0.0</modelVersion>
<groupId>app-desktop-ui</groupId>
<artifactId>app-desktop-ui</artifactId>
<packaging>jar</packaging>
<version>1.0</version>
<name>应用程序桌面 UI</name>
<description>app-desktop-ui 依赖 bus-core-api</description>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<dependencies>
<dependency>
<groupId>bus-core-api</groupId>
<artifactId>bus-core-api</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>system</scope>
<systemPath>/home/ppp/codes/java/MVN/Maven-Build-Automation/bus-core-api/target/bus-core-api-1.0-SNAPSHOT.jar</systemPath>
</dependency>
</dependencies>
</project>

bus-core-api/pom.xml

修改 bus-core-api 项目的 pom.xml 文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<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">
<modelVersion>4.0.0</modelVersion>
<groupId>bus-core-api</groupId>
<artifactId>bus-core-api</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>总线核心 Api</name>
<description>总线核心 Api</description>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<build>
<plugins>
<plugin>
<artifactId>maven-invoker-plugin</artifactId>
<version>2.0.0</version>
<configuration>
<debug>true</debug>
<projectsDirectory>/home/ppp/codes/java/MVN/Maven-Build-Automation/projects</projectsDirectory>
<cloneProjectsTo>${project.build.directory}</cloneProjectsTo>
</configuration>
<executions>
<execution>
<id>id-integration-test</id>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

节点指定的是 app-web-ui 和 app-desktop-ui 项目的目录 /home/ppp/codes/java/MVN/Maven-Build-Automation/projects。

maven-invoker-plugin 插件绑定的 Maven 生命周期阶段为 integration-test (也可以改为 build 等)以上,所以在命令行上输入 integration-test 阶段及其以上的都可以触发。

上面的 xml 中用到了 Invoker 插件:用于运行一组 Maven 项目,该插件可以确定每个项目执行是否成功,并且可以选择验证从给定项目执行生成的输出。比较适合用于集成测试、实现多个项目关联自动化构建等。

在 bus-core-api 目录下执行下列的两个命令均可构建项目 bus-core-api:

1
2
mvn clean install -U
mvn integration-test

结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
[INFO] Scanning for projects...                                                                                                                                          
[INFO]
[INFO] ---------------------< bus-core-api:bus-core-api >----------------------
[INFO] Building 总线核心 Api 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ bus-core-api ---
[INFO] Deleting /home/ppp/codes/java/MVN/Maven-Build-Automation/bus-core-api/target
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ bus-core-api ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /home/ppp/codes/java/MVN/Maven-Build-Automation/bus-core-api/src/main/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ bus-core-api ---
[INFO] No sources to compile
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ bus-core-api ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /home/ppp/codes/java/MVN/Maven-Build-Automation/bus-core-api/src/test/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ bus-core-api ---
[INFO] No sources to compile
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ bus-core-api ---
[INFO] No tests to run.
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ bus-core-api ---
[WARNING] JAR will be empty - no content was marked for inclusion!
[INFO] Building jar: /home/ppp/codes/java/MVN/Maven-Build-Automation/bus-core-api/target/bus-core-api-1.0-SNAPSHOT.jar
[INFO]
[INFO] --- maven-invoker-plugin:2.0.0:run (id-integration-test) @ bus-core-api ---
[INFO] Building: app-desktop-ui/pom.xml
[INFO] ..SUCCESS (1.5 s)
[INFO] Building: app-web-ui/pom.xml
[INFO] ..SUCCESS (1.5 s)
[INFO] -------------------------------------------------
[INFO] Build Summary:
[INFO] Passed: 2, Failed: 0, Errors: 0, Skipped: 0
[INFO] -------------------------------------------------
[INFO]
[INFO] --- maven-install-plugin:2.4:install (default-install) @ bus-core-api ---
[INFO] Installing /home/ppp/codes/java/MVN/Maven-Build-Automation/bus-core-api/target/bus-core-api-1.0-SNAPSHOT.jar to /home/ppp/.m2/repository/bus-core-api/bus-core-api/1.0-SNAPSHOT/bus-core-api-1.0-SNAPSHOT.jar
[INFO] Installing /home/ppp/codes/java/MVN/Maven-Build-Automation/bus-core-api/pom.xml to /home/ppp/.m2/repository/bus-core-api/bus-core-api/1.0-SNAPSHOT/bus-core-api-1.0-SNAPSHOT.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.956 s
[INFO] Finished at: 2022-05-31T02:19:19+08:00
[INFO] ------------------------------------------------------------------------

可以看到第 32 到 35 行,app-web-ui 和 app-desktop-ui 两个项目也自动构建了。


Share