Rainbond构建Java Maven项目原理解读
Apache Maven 相关知识说明
Apache Maven 是跨平台的项目管理工具。主要服务于基于 Java 平台的项目构建,项目管理和项目信息管理。所谓的项目构建就是对项目进行清理、编译、测试、报告、打包、部署等一系列的过程称为项目的构建。
关于更多的 Maven 介绍参考官方文档:https://maven.apache.org/
标准的 Maven 管理的 Java 项目一般有几种制品打包方式:
-
Jar 包
此类打包方式过去主要用于公共的类库项目,如今也作为 SpringBoot 等架构的服务类项目的打包方式。打成 Jar 包的项目一般不需要依赖中间件可以直接运行。
-
War 包
过去传统 Java 服务的主要打包方式,运行于 Tomcat 等中间件中。
Maven 的项目组织形式一般有两种:
-
单模块
这类方式一般被小型项目采用,主工程直接定义项目的依赖和打包形式等配置。
-
多模块
这类方式目前使用面较广,更加灵活的项目组织方式,一个父工程,它包含了两个子工程(模块),一个 core 模块,一个 webapp 模块,webapp 模块依赖于 core 模块。这是一种很常见的工程划分方式,即 core 模块中包含了某个领域的核心业务逻辑,webapp 模块通过调用 core 模块中服务类来创建前端网站。这样将核心业务逻辑和前端展现分离开来,如果之后决定开发支持移动端 APP,那么 core 模块是可以重用。
多模块的工程可以单独构建指定的服务模块,单独构建时也同时会构建其依赖的其他模块。
Maven 依赖包管理是其核心功能,依赖包管理我们需要注意以下几点内容:
-
本地 Maven 仓库
本地仓库存在于编译环境的本地磁盘,可以认为这是依赖包的第一级缓存。存储路径在settings.xml文件中配置localRepository
-
远程仓库
远程仓库包括 Maven 中央仓库,企业自建私服或其他云厂商提供的仓库, 用户在 pom.xml 文件或settings.xml文件中配置,仓库认证信息只能在settings.xml中配置。
-
远程仓库代理或镜像
在settings.xml配置文件中可以配置mirrors 来设置,比如使用私服来可以缓存所有外部仓库的镜像。
<mirrors>
<mirror>
<id>nexus</id>
<name>internal nexus repository</name>
<url>http://192.168.0.1:8081/nexus/content/groups/public/</url>
<mirrorOf>*</mirrorOf>
</mirror>
</mirrors>
Rainbond 识别 Maven 项目
Rainbond rbd-chaos 服务通过 Git、SVN 源代码管理协议从用户指定的代码仓库获取项目源代码,从项目主目录下读取pom.xml文件,如果读取到,则认为当前项目为 Java-Maven 类型,将采用 Java-Maven 类型对应的源码编译方式对源代码进行打包构建。
1.多模块代码检测
在服务创建过程中会发起源码检测任务,源码检测程序会读取pom.xml文件,如果从文件中读取到多模块的配置,即认为当前代码仓库是多模块类型,将批量创建多个 Rainbond 组件。
检测程序递归读取所有模块的pom.xml的配置,塞选所有的打包方式为 jar 或者 war 的模块,并自动生成默认的 Maven 构建命令(BUILD_MAVEN_CUSTOM_GOALS)和服务启动命 令(BUILD_PROCFILE),这两个命令需要用户自行判断是否正确并修正,下文详细描述这两个参数的自定义方式:
构建命令类似如下形式:
clean install -pl module_name -am
Rainbond 为每一个模块创建一个对应的服务,因此用户需要根据自身项目情况人工判断哪些是公共类库项目,在批量创建过程中取消公共类库类模块的创建。每一个服务对应有构建命令,如果不正确也需要用户自行修改。
2.单模块代码检测
如果识别的项目是单模块项目,则直接进入服务构建流程。
Rainbond 构建 Maven 组件
当用户从 UI 触发或 Webhook 触发服务进行构建后,构建任务将由数据中心 API 服务生成发送到消息系统,由 rbd-chaos 服务从消息系统竞争构建任务,如果当前 rbd-chaos 节点正在执行的构建任务超过了最大值(默认最大值为节点 CPU 核数的 2 倍),将暂停任务的竞争。获取到任务后开始通过 git 或 svn 客户端获取项目代码并缓存下来,下一次构建任务在缓存代码的基础上进行代码更新。然后启动 builder 容器传入代码和构建参数(具体构建参数在下文中说明)执行构建任务。
构建任务的执行有如下步骤:
1. JDK 和 Maven 版本的选择
在项目源码主目录中可以定义system.properties 文件来指定 JDK 的版本和 Maven 的版本。格式如下:
java.runtime.version=1.9
maven.version=3.2.5
如果代码中存在system.properties 文件,代码检测阶段会读取此文件定义的 JDK 版本为 BUILD_RUNTIMES 变量赋默认值。
用户可以在 Rainbond 平台设置以下变量来选择 JDK 和 Maven 的版本:
- BUILD_RUNTIMES(OPEN-JDK 版本)可选值 1.6 1.7 1.9 10 11
- BUILD_ENABLE_ORACLEJDK (是否使用 ORACLEJDK)默认为否。
- BUILD_ORACLEJDK_URL (ORACLEJDK 下载路径)用户指定。
- BUILD_RUNTIMES_MAVEN (Maven 版本),默认为 3.3.9 如果 JDK 版本为 1.6 默认值为 3.2.5
注意,本文中所有描述的以 BUILD_开头的变量都可以在服务环境变量中设置,其他大部分变量也已在构建源设置中体现。
1.1 JDK 的下载
如果开启了 ORACLEJDK 的支持,通过指定的 BUILD_ORACLEJDK_URL 路径下载 JDK, 如果未指定,Maven 构建脚本默认根据上述设置变量指定的版本来构建 JDK 的下载路径,比如:
http://lang.goodrain.me/jdk/openjdk1.8.0_20.tar.gz