maven 自动化构建
自动化构建定义了这样一种场景: 在一个项目成功构建完成后,其相关的依赖工程即开始构建,这样可以保证其依赖项目的稳定。
比如一个团队正在开发一个项目 bus-core-api, 并且有其他两个项目 app-web-ui 和 app-desktop-ui 依赖于这个项目。
app-web-ui 项目使用的是 bus-core-api 项目的 1.0 快照:
<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 快照:
<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 项目:
<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,来自行管理构建自动化。
1.使用 maven
修改 bus-core-api 项目的 pom.xml 文件。
<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>
<build>
<plugins>
<plugin>
<artifactid>maven-invoker-plugin</artifactid>
<version>1.6</version>
<configuration>
<debug>true</debug>
<pomincludes>
<pominclude>app-web-ui/pom.xml</pominclude>
<pominclude>app-desktop-ui/pom.xml</pominclude>
</pomincludes>
</configuration>
<executions>
<execution>
<id>build</id>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
打开命令控制台,切换到 c:\ > mvn > bus-core-api 目录下,然后执行以下命令。
c:\mvn\bus-core-api>mvn clean package -u
执行完命令后,maven 将开始构建项目 bus-core-api。
[info] scanning for projects...
[info] ------------------------------------------------------------------
[info] building bus-core-api
[info] task-segment: [clean, package]
[info] ------------------------------------------------------------------
...
[info] [jar:jar {execution: default-jar}]
[info] building jar: c:\mvn\bus-core-ui\target\
bus-core-ui-1.0-snapshot.jar
[info] ------------------------------------------------------------------
[info] build successful
[info] ------------------------------------------------------------------
bus-core-api 构建成功后,maven 将开始构建 app-web-ui 项目。
[info] ------------------------------------------------------------------
[info] building app-web-ui
[info] task-segment: [package]
[info] ------------------------------------------------------------------
...
[info] [jar:jar {execution: default-jar}]
[info] building jar: c:\mvn\app-web-ui\target\
app-web-ui-1.0-snapshot.jar
[info] ------------------------------------------------------------------
[info] build successful
[info] ------------------------------------------------------------------
app-web-ui 构建成功后,maven 将开始构建 app-desktop-ui 项目。
[info] ------------------------------------------------------------------
[info] building app-desktop-ui
[info] task-segment: [package]
[info] ------------------------------------------------------------------
...
[info] [jar:jar {execution: default-jar}]
[info] building jar: c:\mvn\app-desktop-ui\target\
app-desktop-ui-1.0-snapshot.jar
[info] -------------------------------------------------------------------
[info] build successful
[info] -------------------------------------------------------------------
2.使用持续集成服务器(ci):
如果使用 ci 服务器更,我们每次的一个新项目,比如说实例中的 app-mobile-ui,添加为依赖 bus-core-api 项目时,开发者就不需要更新 bus-core-api 项目的 pom。hudson 将会借助 maven 的依赖管理功能实现工程的自动化创建。

hudson 把每个项目构建当成一次任务。在一个项目的代码提交到 svn (或者任何映射到 hudson 的代码管理工具)后,hudson 将开始项目的构建任务,并且一旦此构建任务完成,hudson 将自动启动其他依赖的构建任务(其他依赖项目的构建)。
在上面的例子中,当 bus-core-ui 源代码在 svn 更新后,hudson 开始项目构建。一旦构建成功,hudson 自动地查找依赖的项目,然后开始构建 app-web-ui 和 app-desktop-ui 项目。


