Java Maven源码构建应用

Maven项目识别策略

平台默认会通过pom.xml来识别源码项目为Java Maven项目。

编译原理

  1. 预编译处理会探测是否定义了启动命令配置文件Procfile,如果未定义会根据打包类型或者项目框架生成默认Procfile文件;
  2. 预编译处理完成后,会根据语言类型选择Java的buildpack去编译项目.在编译过程中会安装定义的JDK版本,Maven版本,然后构建编译Maven源码项目;
  3. 编译完成后会检查是否在平台设置了Procfile参数,若配置了会重写启动命令配置文件Procfile.

默认Maven项目构建命令如下

mvn -DskipTests clean dependency:list install

Maven项目源码规范

在此步骤中,你需要提供一个可用的Java Maven源码程序用来部署在Rainbond平台上,此应用程序至少需要满足如下条件:

  1. 本地可以使用默认Maven命令正常构建的Java Maven源码程序,多模块项目需要确定子模块可以单独编译即mvn install -pl <modulename> -am
  2. 源码程序必须托管在gitlab等相关git或者svn服务上
  3. 源码程序根路径下必须需要存在Java的依赖管理工具Maven所需的pom.xml文件
1. pom.xml规范

SpringBoot项目打包方式推荐使用 jar 包方式 非SpringBoot项目打包方式推荐使用 war 包方式

2. Procfile规范

如果项目未定义Procfile文件,平台默认会根据识别项目类型生成默认Procfile。

  • 打包方式为 war 包,平台使用 webapp-runner.jar 将打包的 war 包运行起来。示例
web: java $JAVA_OPTS -jar ./webapp-runner.jar --port $PORT target/*.war
  • 打包方式为 jar 包,示例
web: java -Dserver.port=$PORT $JAVA_OPTS -jar target/*.jar

上述是默认Procfile,如果需要扩展更多启动参数,可以自定义Procfile。

1. `web:`和`java`之间有一个空格 2. 文件结尾不能包含特殊字符 3. 如果是多模块项目,需注意编译后jar包或者war包路径,其路径为`<子模块名>/targets/*.jar`或`<子模块名>/targets/*.war` 4. JAVA_OPTS: 平台会根据应用的内存大小,自动设置Xmx和Xms的值 5. PORT: 根据用户在平台设置的端口决定监听,默认监听端口为 5000
当调整了Web服务器支持后,打包成War需要调整启动命令 - 选择tomcat不同版本时 `web: java $JAVA_OPTS -jar ./webapp-runner.jar --port $PORT ./*.war` - 选择jetty不同版本时 `web: java $JAVA_OPTS -jar ./jetty-runner.jar --port $PORT ./*.war` 需要配置context path,可以通过自定义Procfile指定[webapp-runner参数path](https://github.com/jsimone/webapp-runner#options) - 示例 `web: java $JAVA_OPTS -jar ./webapp-runner.jar --path --port $PORT ./*.war`

编译运行环境设置

在选择JDK版本或其他组件版本时,需要注意JDK或者其他组件版本不要选择比项目使用的版本过高或者过低以免导致源码编译失败
OpenJDK支持

当前Rainbond支持OpenJDK如下版本为:

  • Java 1.6 - 1.6.0_27
  • Java 1.7 - 1.7.0_95
  • Java 1.8 - 1.8.0_74
  • Java 1.9 - 1.9-latest
  • Java 10 - 10.0.2
  • Java 11 - 11.0.1

平台默认版本使用1.8。若需要使用其他版本的OpenJDK,可以通过在源码根目录下添加system.properties文件来设定java.runtime.version的值来指定所需版本的JDK。

# system.properties 目前Rainbond能识别的版本值为11,10,1.9,1.8,1.7,1.6
java.runtime.version=1.8
OracleJDK支持

平台目前也支持OracleJDK,但此特性需要在平台里启用才会生效。
默认不内置提供OracleJDK下载,需要在设置里启用OracleJDK后配置相关OracleJDK下载地址。

OracleJDK下载地址格式要求: http://<web服务URL>/jdk-8u201-linux-x64.tar.gz

配置Maven版本

Rainbond默认的推荐Maven版本为3.3.1,支持如下版本: 3.0.5, 3.1.1, 3.2.5, 3.3.1, 3.3.9.
如果你的源码根目录定义了mvnw,将使用此脚本启动Maven进程。
与Java设置指定版本一致,即通过system.properties文件来设定maven.version的值来指定所需版本的Maven.

maven.version=3.3.1

如果指定了Maven版本,则会忽略mvnw

平台设置的配置优先级要高于程序代码中定义的配置,如Java JDK版本的选择,在程序代码里通过`system.properties`指定了JDK版本为1.9,在平台上选择了JDK版本为11,那么默认在进行源码编译时会优先使用平台指定的版本JDK11
Web服务支持

如果Maven项目打包成war包,则需要配置Web服务支持。

通过web服务(tomcat或者jetty)将war包运行起来,即通过java -jar ./webapp-runner.jar ./*.war或者java -jar ./jetty-runner.jar ./*.war方式运行.

目前可以通过构建源设置web服务版本或者源码根目录定义webserver文件

  1. 控制台构建源配置支持版本 tomcat7,tomcat8,tomcat85,tomcat9,jetty7,jetty9
  2. 源码根目录下定义webserver版本
    • webapp-runner-7.0.91.0.jar
    • webapp-runner-8.0.52.0.jar,webapp-runner-8.5.38.0.jar
    • webapp-runner-9.0.16.0.jar
    • jetty-runner-7.5.4.v20111024.jar,jetty-runner-9.4.0.v20161208.jar

具体对应关系如下:

web服务支持 web服务版本 自定义Procfile中jar文件名
tomcat7 webapp-runner-7.0.91.0.jar webapp-runner.jar
tomcat8 webapp-runner-8.0.52.0.jar webapp-runner.jar
tomcat85 (默认) webapp-runner-8.5.38.0.jar webapp-runner.jar
tomcat9 webapp-runner-9.0.16.0.jar webapp-runner.jar
jetty7 jetty-runner-7.5.4.v20111024.jar jetty-runner.jar
jetty9 jetty-runner-9.4.0.v20161208.jar jetty-runner.jar
选择tomcat7版本需要注意确定本地可以通过`java -jar ./webapp-runner-7.0.91.0.jar ./*.war`运行 关于webapp-runner详细配置请参考[webapp-runner使用说明](/user-manual/app-creation/language-support/java_more/webapp-runner/)

高级构建选项

在构建高级设置或构建源处启用高级构建特性

Maven Mirror配置
环境变量 默认值 说明
BUILD_MAVEN_MIRROR_DISABLE 默认是启用Maven Mirror
BUILD_MAVEN_MIRROR_OF *
BUILD_MAVEN_MIRROR_URL maven.goodrain.me 平台默认Mirror地址
Maven 构建高级配置
环境变量 默认值 说明
BUILD_MAVEN_CUSTOM_OPTS -DskipTests Maven构建参数
BUILD_MAVEN_CUSTOM_GOALS clean dependency:list install Maven构建参数
BUILD_MAVEN_SETTINGS_URL 默认为空Maven配置地址
BUILD_MAVEN_JAVA_OPTS -Xmx1024m 默认

其他说明

如果编译成war包,运行时默认会将war文件解压至/app/target/目录下,不支持通过添加配置文件的方式到war解压路径下,否则会导致应用无法正常启动

示例demo程序

示例https://github.com/goodrain/java-maven-demo是Spring Boot项目。

自定义的Procfile为

web: java $JAVA_OPTS -jar target/java-maven-demo-0.0.1.jar
本地调试(可选)

如果可以访问管理节点,可以在管理节点测试是否可以正常源码构建

git clone https://github.com/goodrain/java-maven-demo.git
cd java-maven-demo
grctl buildtest

推荐阅读