Profile

  1. <profiles>
  2. <profile>
  3. <id>local</id>
  4. <properties>
  5. <gm.jar.profile>local</gm.jar.profile>
  6. <gm.jar.version>1.0.0-SNAPSHOT</gm.jar.version>
  7. </properties>
  8. <activation>
  9. <property>
  10. <name>gm.build.type</name>
  11. <value>local</value>
  12. </property>
  13. <activeByDefault>true</activeByDefault>
  14. </activation>
  15. </profile>
  16. <profile>
  17. <id>dev</id>
  18. <properties>
  19. <gm.jar.profile>dev</gm.jar.profile>
  20. <gm.jar.version>1.0.0-SNAPSHOT</gm.jar.version>
  21. </properties>
  22. <activation>
  23. <property>
  24. <name>gm.build.type</name>
  25. <value>dev</value>
  26. </property>
  27. </activation>
  28. </profile>
  29. <profile>
  30. <id>qa</id>
  31. <properties>
  32. <gm.jar.profile>qa</gm.jar.profile>
  33. <gm.jar.version>5.0.0-SNAPSHOT</gm.jar.version>
  34. </properties>
  35. <activation>
  36. <property>
  37. <name>gm.build.type</name>
  38. <value>qa</value>
  39. </property>
  40. </activation>
  41. </profile>
  42. <profile>
  43. <id>prod</id>
  44. <properties>
  45. <gm.jar.profile>prod</gm.jar.profile>
  46. <gm.jar.version>9.0.0-SNAPSHOT</gm.jar.version>
  47. </properties>
  48. <activation>
  49. <property>
  50. <name>gm.build.type</name>
  51. <value>prod</value>
  52. </property>
  53. </activation>
  54. </profile>
  55. </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>