Profile
<profiles><profile><id>local</id><properties><gm.jar.profile>local</gm.jar.profile><gm.jar.version>1.0.0-SNAPSHOT</gm.jar.version></properties><activation><property><name>gm.build.type</name><value>local</value></property><activeByDefault>true</activeByDefault></activation></profile><profile><id>dev</id><properties><gm.jar.profile>dev</gm.jar.profile><gm.jar.version>1.0.0-SNAPSHOT</gm.jar.version></properties><activation><property><name>gm.build.type</name><value>dev</value></property></activation></profile><profile><id>qa</id><properties><gm.jar.profile>qa</gm.jar.profile><gm.jar.version>5.0.0-SNAPSHOT</gm.jar.version></properties><activation><property><name>gm.build.type</name><value>qa</value></property></activation></profile><profile><id>prod</id><properties><gm.jar.profile>prod</gm.jar.profile><gm.jar.version>9.0.0-SNAPSHOT</gm.jar.version></properties><activation><property><name>gm.build.type</name><value>prod</value></property></activation></profile></profiles>
基础依赖
在 nxcloud-dependencies 项目中定义了整个框架的基本依赖,目前保持 Snapshot 发布,在框架保持稳定后可改成 Release 发布。
通过以下代码以 BOM 方式进行统一依赖版本管理。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>nxcloud.foundation</groupId>
<artifactId>nxcloud-dependencies</artifactId>
<version>${gm.jar.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
不同 Profile 版本管理机制
对于不同的 Profile 环境,在 deploy 时使用不同的版本号来提供服务(使用 SNAPSHOT 机制,如需使用 RELEASE 机制可通过版本前缀或后缀的方式来区分 Profile),不同环境的版本号如下(可自行修改):
- dev: 1.0.0-SNAPSHOT
- qa: 5.0.0-SNAPSHOT
- prod: 9.0.0-SNAPSHOT
对于其他项目提供的依赖,统一使用 ${gm.jar.version} 变量来标记版本。
对于同一项目内的子模块依赖,统一使用 ${project.version} 变量来标记版本,方便项目开发者本地开发和调试切换不同的环境。
激活不同的 Profile
命令行打包(CI/CD)时需要使用参数条件来激活,而不是直接使用 -P 指定(直接指定无法传递到子模块和依赖):
mvn clean package deploy -U -Dgm.build.type=dev
插件和构建配置
<properties>
<!-- 插件版本 -->
<plugin.maven.jar.version>3.2.0</plugin.maven.jar.version>
<plugin.maven.compiler.version>3.8.1</plugin.maven.compiler.version>
<plugin.maven.source.version>3.2.1</plugin.maven.source.version>
<plugin.maven.javadoc.version>3.2.0</plugin.maven.javadoc.version>
<plugin.maven.deploy.version>3.0.0-M1</plugin.maven.deploy.version>
<plugin.maven.war.version>3.3.1</plugin.maven.war.version>
<plugin.maven.surefire.version>3.0.0-M5</plugin.maven.surefire.version>
<plugin.maven.failsafe.version>3.0.0-M5</plugin.maven.failsafe.version>
<plugin.maven.assembly.version>3.3.0</plugin.maven.assembly.version>
<plugin.maven.enforcer.version>3.0.0-M3</plugin.maven.enforcer.version>
<plugin.maven.clean.version>3.1.0</plugin.maven.clean.version>
<plugin.maven.dependency.version>3.1.2</plugin.maven.dependency.version>
<plugin.codehaus.build.helper.version>3.2.0</plugin.codehaus.build.helper.version>
<plugin.mybatis.generator.version>1.4.0</plugin.mybatis.generator.version>
<plugin.spring.boot.version>2.4.2</plugin.spring.boot.version>
<plugin.fabric8.docker.version>0.34.1</plugin.fabric8.docker.version>
</properties>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>${plugin.maven.jar.version}</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${plugin.maven.compiler.version}</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>${plugin.maven.source.version}</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>${plugin.maven.javadoc.version}</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<version>${plugin.maven.deploy.version}</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>${plugin.maven.war.version}</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${plugin.maven.surefire.version}</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>${plugin.maven.failsafe.version}</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>${plugin.maven.assembly.version}</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>${plugin.maven.enforcer.version}</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-clean-plugin</artifactId>
<version>${plugin.maven.clean.version}</version>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>${plugin.codehaus.build.helper.version}</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>${plugin.maven.dependency.version}</version>
</plugin>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>${plugin.mybatis.generator.version}</version>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${plugin.spring.boot.version}</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>${plugin.fabric8.docker.version}</version>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-clean-plugin</artifactId>
<executions>
<execution>
<id>auto-clean</id>
<phase>initialize</phase>
<goals>
<goal>clean</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<addMavenDescriptor>true</addMavenDescriptor>
<index>true</index>
<manifest>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
</plugin>
</plugins>
<finalName>${project.artifactId}-${gm.jar.version}</finalName>
</build>
不发布到仓库
对于最终运行的实例模块等情况,不需要发布到 Nexus:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<configuration>
<!-- 非lib项目不需要发布到仓库 -->
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
SpringBoot 打包 bootJar
在插件管理中已经定义了 goal,所以这里直接加入构建即可。
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
根据 DockerFile 构建 Docker 镜像
在模块根目录放置 DockerFile
FROM openjdk:11-jdk-slim
ENV TZ=Asia/Shanghai
ENV JAVA_OPTS -Xms128M -Xmx1024M -Djava.security.egd=file:/dev/./urandom -Dfile.encoding=UTF-8
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
VOLUME /opt/deploy/logs
ARG JAR_FILE=target/*.jar
ARG PROFILE
COPY ${JAR_FILE} app.jar
ENV ENV_PROFILE=${PROFILE}
ENTRYPOINT exec java ${JAVA_OPTS} -Dspring.profiles.active=${ENV_PROFILE} -jar app.jar
<properties>
<docker.buildArg.PROFILE>${gm.jar.profile}</docker.buildArg.PROFILE>
</properties>
<build>
<plugins>
<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<configuration>
<images>
<image>
<name>${project.name}-${gm.jar.profile}</name>
<build>
<dockerFile>${project.basedir}/Dockerfile</dockerFile>
</build>
</image>
</images>
</configuration>
</plugin>
</plugins>
</build>
