Maven创建构建测试工程、快照、自动化构建部署

如何创建一个maven工程,如何使用archetype插件,快照是什么?快照与版本的区别?如何快速集成?如何自动化从svn等版本管理工具上获取并部署?那接下来就看一下这篇文章吧

Maven 使用原型(archetype)插件创建工程,我们将使用 maven-archetype-quickstart 插件。

mvn archetype:generate
-DgroupId=com.companyname.bank 
-DartifactId=consumerBanking 
-DarchetypeArtifactId=maven-archetype-quickstart 
-DinteractiveMode=false
<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>com.companyname.projectgroup</groupId>
      <artifactId>project</artifactId>
      <version>1.0</version>
      <dependencies>
         <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
         </dependency>
      </dependencies>  
</project>

mvn clean package
– 我们给了 maven 两个目标,首先清理目标目录(clean),然后- 打包工程构建的输出为 jar(package)文件。
– 打包好的 jar 文件可以在 consumerBanking\target 中获得,名称为 consumerBanking-1.0-SNAPSHOT.jar。
– 测试报告存放在 consumerBanking\target\surefire-reports 文件夹中。
– Maven 编译源码文件,以及测试源码文件。
– 接着 Maven 运行测试用例。
– 最后 Maven 创建工程包

外部依赖

<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/maven-v4_0_0.xsd">
       <modelVersion>4.0.0</modelVersion>
       <groupId>com.companyname.bank</groupId>
       <artifactId>consumerBanking</artifactId>
       <packaging>jar</packaging>
       <version>1.0-SNAPSHOT</version>
       <name>consumerBanking</name>
       <url>http://maven.apache.org</url>

       <dependencies>
          <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
             <version>3.8.1</version>
             <scope>test</scope>
          </dependency>

          <dependency>
             <groupId>ldapjdk</groupId>
             <artifactId>ldapjdk</artifactId>
             <scope>system</scope>
             <version>1.0</version>
             <systemPath>${basedir}\src\lib\ldapjdk.jar</systemPath>
          </dependency>
       </dependencies>

    </project>
  • 外部依赖(library jar location)能够像其他依赖一样在 pom.xml 中配置。
  • 指定 groupId 为 library 的名称。
  • 指定 artifactId 为 library 的名称。
  • 指定作用域(scope)为系统。
  • 指定相对于工程位置的系统路径。

工程文档

mvn site 创建应用程序的文档

快照

快照是一个特殊版本,表示当前开发的一个副本。Maven每一次构建从远程仓库中检出一份新的快照

快照与版本
Maven一旦指定了版本,将不会尝试从仓库下载。
对于快照,则可以每次获取最新快照

 <dependency>
     <groupId>data-service</groupId>
         <artifactId>data-service</artifactId>
         <version>1.0-SNAPSHOT</version>
         <scope>test</scope>
     </dependency>

构建自动化

构建自动化定义为一种场景:一旦该工程成功构建完成,其相关的依赖工程即开始构建,目的是为了保证其依赖项目的稳定。

假设app-web-ui 和 app-desktop-ui依赖 bus-core-api,我们有 2 种方式:

  • 在 bus-core-api 的 pom 文件里添加一个编译目标来提醒 app-web-ui 工程和 app-desktop-ui 工程启动创建。
  • 使用一个持续集成(CI)的服务器,比如 Hudson,来实现自动化创建。

bus-core-api

<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>
   ```
mvn clean package -U

### 使用持续集成服务器(CI)

Hunson 把每次创建工程看做一个工作。一旦工程代码合入到 svn 或者其他任何的映射到Hudson上的代码源管理工具上,Hunson 便开始一次的创建工作,等到该工作完成后,它将会自动创建其他相关的依赖工作或者依赖工程。

当 bus-core-api 的源代码在 SVN 上有更新时, Hudson 将会启动创建。当创建完成后,Hudson 开始自动寻找其依赖的工程,然后启动 app-web-ui 和 app-desktop-ui 工程。

## 管理依赖
多模块工程,模块间的依赖关系就变得非常复杂,管理也变得很困难。

### 传递依赖发现
Maven 可以避免去搜索所有需要的库资源的这种需求。通过读取工程文件(pom.xml)中的依赖项,Maven 可以找出工程之间的依赖关系。

- 依赖调节  决定当多个手动创建的版本同时出现时,哪个依赖版本将会被使用。 如果两个依赖版本在依赖树里的深度是一样的时候,第一个被声明的依赖将会被使用。
- 依赖管理  直接的指定手动创建的某个版本被使用。例如当一个工程 C 在自己的以来管理模块包含工程 B,即 B 依赖于 A, 那么 A 即可指定在 B 被引用时所使用的版本。
- 依赖范围  包含在构建过程每个阶段的依赖。
- 依赖排除  任何可传递的依赖都可以通过 "exclusion" 元素被排除在外。举例说明,A 依赖 B, B 依赖 C,因此 A 可以标记 C 为 “被排除的”。
- 依赖可选  任何可传递的依赖可以被标记为可选的,通过使用 "optional" 元素。例如:A 依赖 B, B 依赖 C。因此,B 可以标记 C 为可选的, 这样 A 就可以不再使用 C。


### 依赖范围
- 编译阶段  该范围表明相关依赖是只在工程的类路径下有效。默认取值。
- 供应阶段  该范围表明相关依赖是由运行时的 JDK 或者 网络服务器提供的。
- 运行阶段  该范围表明相关依赖在编译阶段不是必须的,但是在执行阶段是必须的。
- 测试阶段  该范围表明相关依赖只在测试编译阶段和执行阶段。
- 系统阶段  该范围表明你需要提供一个系统路径。
- 导入阶段  该范围只在依赖是一个 pom 里定义的依赖时使用。同时,当前工程的POM 文件的 部分定义的依赖关系可以取代某特定的 POM。

## 自动化部署
一般情况下,在一个工程开发进程里,一次部署的过程包含需如下步骤:

- 合入每个子工程下的代码到 SVN 或者源代码库,并标记它。
- 从 SVN 下载完整的源代码。
- 构建应用程序。
- 保存构建结果为 WAR 或者 EAR 类型文件并存放到一个共同的指定的网络位置上。
- 从网络上获得该文件并且部署该文件到产品线上。
- 更新文档日期和应用程序的版本号。

### 实现自动化部署
- Maven 构建和发布项目,
- SubVersion, 源代码库用以管理源代码,
- 远程仓库管理工具 (Jfrog/Nexus) 用以管理工程的二进制文件。


4.0.0
bus-core-api
bus-core-api
1.0-SNAPSHOT jar
http://www.svn.com
scm:svn:http://localhost:8080/svn/jrepo/trunk/
Framework

scm:svn:{username}/{password}@localhost:8080:
common_core_api:1101:code




Core-API-Java-Release
Release repository
http://localhost:8081/nexus/content/repositories/
Core-Api-Release



org.apache.maven.plugins
maven-release-plugin
2.0-beta-9

false
deploy
[bus-core-api-release-checkin]-<
/scmCommentPrefix>
- SCM   配置 SVN 的路径,Maven 将从该路径下将代码取下来。
- 仓库    成功构建出来的 WAR/EAR/JAR 或者其他的构建结果存放的路径。
- 插件    maven-release-plugin 用以自动化部署的过程。

- mvn release:clean 清理工作空间,保证最新的发布进程成功进行
- mvn release:rollback 回滚修改的工作空间代码和配置保证发布过程成功进行。
- mvn release:prepare

检查本地是否存在还未提交的修改
确保没有快照的依赖
改变应用程序的版本信息用以发布
更新 POM 文件到 SVN
运行测试用例
提交修改后的 POM 文件
为代码在 SVN 上做标记
增加版本号和附加快照以备将来发布
提交修改后的 POM 文件到 SVN.
“`
mvn release:perform 将代码切换到之前做标记的地方,运行 Maven 部署目标来部署 WAR 文件或者构建相应的结构到仓库里

0条留言