目录
如何创建一个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) 用以管理工程的二进制文件。
Framework
common_core_api:1101:code
Core-Api-Release
/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 文件或者构建相应的结构到仓库里