落地实践之基于MAVEN的BUILD插件打包应用程序

1,265 阅读5分钟

日常构建的应用程序在服务器部署时需要将所依赖的jar打包放在一起,方便部署。本文主要使用maven的build和assembly生成可直接部署的打包程序(zip格式)。

BUILD插件介绍

maven-surefire-plugin

Surefire Plugin是Maven的一个插件,用于执行Java单元测试。它提供了一种方便的方式来运行测试,并生成测试报告。 Surefire Plugin主要有以下特点和功能:

  1. 自动发现测试:Surefire Plugin可以自动发现项目中的测试类。默认情况下,它会查找以Test结尾的类,并执行其中的测试方法。
  2. 多种测试框架支持:Surefire Plugin支持多种测试框架,包括JUnit、TestNG和其他一些常见的测试框架。你可以根据项目需求选择适合的测试框架。
  3. 并行执行测试:Surefire Plugin支持并行执行测试,以加快测试的执行速度。你可以配置插件来指定并行执行的线程数。
  4. 测试报告生成:Surefire Plugin会生成详细的测试报告,包括测试结果、测试覆盖率等信息。它支持多种报告格式,如文本、XML和HTML。
  5. 跳过测试:Surefire Plugin允许你在构建过程中跳过测试阶段,以节省时间。这在某些情况下可能很有用,例如在快速构建和部署时。

使用举例如下:

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-surefire-plugin</artifactId>
      <version>3.0.0-M5</version>
      <configuration>
        <!-- 配置要运行的测试类 -->
        <includes>
          <include>**/*Test.java</include>
        </includes>
        <!-- 配置测试报告的输出目录 -->
        <reportsDirectory>${project.build.directory}/surefire-reports</reportsDirectory>
        <!-- 配置测试报告的格式 -->
        <reportFormat>plain</reportFormat>
      </configuration>
    </plugin>
  </plugins>
</build>

maven-dependency-plugin

Maven Dependency Plugin是Maven的一个插件,用于管理和操作项目的依赖项。它提供了一系列功能,可以帮助你分析、解决依赖冲突、复制依赖项等。

以下是Maven Dependency Plugin的一些常见功能:

  1. 依赖分析:Dependency Plugin允许你分析项目的依赖关系,包括依赖树、依赖冲突等。你可以使用dependency:tree目标来生成依赖树,并查看项目中所有依赖项的层级关系。
  2. 依赖复制:Dependency Plugin可以帮助你将依赖项复制到指定的目录。你可以使用dependency:copy目标来指定要复制的依赖项和目标目录,以便将依赖项用于其他用途,如打包、部署等。
  3. 依赖解析:Dependency Plugin可以解析项目的依赖关系,并生成有关依赖项的详细信息。你可以使用dependency:resolve目标来解析依赖项,并输出有关每个依赖项的信息,如版本、文件路径等。
  4. 依赖过滤:Dependency Plugin允许你根据条件过滤依赖项。你可以使用dependency:copy-dependencies目标来复制依赖项,并根据不同的过滤器配置来选择性地复制特定的依赖项。
  5. 依赖报告:Dependency Plugin可以生成关于项目依赖项的报告。你可以使用dependency:analyze目标来生成依赖报告,其中包括未使用的依赖项、潜在的依赖冲突等。

使用举例如下:

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-dependency-plugin</artifactId>
      <version>3.1.2</version>
      <executions>
        <execution>
          <id>copy-dependencies</id>
          <phase>package</phase>
          <goals>
            <goal>copy-dependencies</goal>
          </goals>
          <configuration>
            <!-- 配置依赖项的复制目录 -->
            <outputDirectory>${project.build.directory}/lib</outputDirectory>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

maven-jar-plugin

Maven Jar Plugin是Maven的一个插件,用于创建可执行的JAR文件。它允许你将项目的编译输出打包为一个JAR文件,并可以配置JAR文件的属性、依赖项等。

常见功能如下:

  1. 打包为JAR文件:Jar Plugin可以将项目的编译输出打包为一个JAR文件。默认情况下,它会将编译后的类文件和资源文件打包到JAR文件中。
  2. 配置JAR属性:Jar Plugin允许你配置JAR文件的属性,如主类、清单文件等。你可以指定一个主类,使得生成的JAR文件可以直接运行。
  3. 包含依赖项:Jar Plugin可以将项目的依赖项打包到生成的JAR文件中。这样,你可以创建一个自包含的JAR文件,无需依赖外部的库文件。
  4. 排除文件:Jar Plugin允许你排除某些文件或目录在打包过程中。你可以通过配置来指定要排除的文件或目录的匹配模式。
  5. 生成源码JAR文件:除了生成编译输出的JAR文件,Jar Plugin还可以生成包含项目源代码的JAR文件。这对于共享和发布源代码非常有用。

举例:

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>
      <version>3.2.2</version>
      <configuration>
        <!-- 配置JAR文件的属性 -->
        <archive>
          <manifest>
            <mainClass>com.example.Main</mainClass>
          </manifest>
        </archive>
      </configuration>
    </plugin>
  </plugins>
</build>

maven-assembly-plugin

Maven Assembly Plugin是Maven的一个插件,用于创建自定义的发布包。它提供了一种灵活的方式来组装和打包项目的构建产物,包括生成zip、tar、jar等格式的归档文件。

Maven Assembly Plugin的主要功能和特点如下:

  1. 自定义装配描述符:Assembly Plugin使用装配描述符(Assembly Descriptor)来定义如何组装和打包项目的构建产物。装配描述符是一个XML文件,它指定了哪些文件和目录应该包含在最终的发布包中。
  2. 多种归档格式支持:Assembly Plugin支持生成多种归档格式的发布包,如zip、tar、jar等。你可以根据项目的需求选择适合的归档格式。
  3. 多个装配描述符:Assembly Plugin允许你定义多个装配描述符,并在构建过程中选择使用哪个描述符。这使得你可以根据需要创建不同的发布包配置。
  4. 文件过滤和重命名:Assembly Plugin支持文件过滤和重命名功能。你可以使用过滤器来处理文件内容,替换占位符等。同时,你也可以重命名文件,使得生成的发布包中的文件名符合预期。
  5. 拷贝、移动和压缩文件:Assembly Plugin允许你在构建过程中拷贝、移动和压缩文件。这使得你可以控制项目构建过程中的文件操作,例如将某些文件从一个位置复制到另一个位置,或将一组文件压缩成一个归档文件。

使用举例如下:

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-assembly-plugin</artifactId>
      <version>3.3.0</version>
      <configuration>
        <!-- 配置装配描述符 -->
        <descriptors>
          <descriptor>src/main/assembly/assembly.xml</descriptor>
        </descriptors>
        <!-- 配置发布包的格式 -->
        <formats>
          <format>zip</format>
        </formats>
        <!-- 配置发布包的输出目录 -->
        <outputDirectory>${project.build.directory}/dist</outputDirectory>
      </configuration>
      <executions>
        <execution>
          <id>make-assembly</id>
          <phase>package</phase>
          <goals>
            <goal>single</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

maven-antrun-plugin

Maven Antrun Plugin是Maven的一个插件,用于在构建过程中执行Ant任务。它允许你使用Ant的功能来扩展和定制项目的构建过程。

Maven Antrun Plugin的主要功能和特点如下:

  1. 执行Ant任务:Antrun Plugin可以执行Ant任务,包括编译、拷贝文件、运行脚本等。你可以使用Ant的强大功能来完成各种构建任务。
  2. 与Maven生命周期集成:Antrun Plugin可以与Maven的生命周期集成,通过配置插件的执行阶段和目标,可以在构建过程的不同阶段执行Ant任务。
  3. 强大的构建定制能力:Antrun Plugin提供了丰富的配置选项,允许你定制构建过程中的各个环节。你可以指定要执行的Ant任务、任务的参数、目标、属性等。
  4. Maven和Ant的无缝集成:Antrun Plugin与Maven和Ant之间具有良好的集成性。你可以在Maven项目中使用Antrun Plugin来利用Ant的特性,同时仍然能够受益于Maven的依赖管理和构建约定等。
  5. 可扩展性:Antrun Plugin支持扩展,你可以编写自己的Ant任务,并在插件配置中引用这些任务。这使得你可以根据需要定制和扩展构建过程。

使用举例:

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-antrun-plugin</artifactId>
      <version>3.0.0</version>
      <executions>
        <execution>
          <id>run-ant-task</id>
          <phase>compile</phase>
          <goals>
            <goal>run</goal>
          </goals>
          <configuration>
            <!-- 配置要执行的Ant任务 -->
            <target>
              <echo message="Running Ant task"/>
              <!-- 在这里定义你的Ant任务 -->
            </target>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

maven-deploy-plugin

Maven Deploy Plugin是Maven的一个插件,用于将构建产物(例如JAR、WAR或其他类型的文件)部署到Maven仓库或远程仓库。它提供了一种方便的方式来发布和共享你的构建产物,以便其他开发人员或项目可以使用它们作为依赖。 Maven Deploy Plugin的主要功能和特点如下:

  1. 将构建产物部署到仓库:Deploy Plugin允许你将项目的构建产物部署到Maven仓库或远程仓库。这些构建产物可以是JAR、WAR、POM等文件。部署到仓库后,其他开发人员或项目可以通过引用它们来使用你的构建产物。
  2. 发布SNAPSHOT和Release版本:Deploy Plugin支持发布两种类型的版本:SNAPSHOT和Release。SNAPSHOT版本表示开发中的版本,通常用于快照构建。Release版本表示稳定的、可发布的版本。Deploy Plugin根据版本类型的不同,将构建产物部署到不同的仓库位置。
  3. 配置仓库信息:Deploy Plugin允许你在项目的pom.xml文件中配置仓库信息,包括仓库的URL、用户名、密码等。这样,在部署过程中,插件可以使用这些信息来连接到仓库并进行部署操作。
  4. 上传附带的源码和文档:Deploy Plugin还支持上传附带的源码和文档。你可以将项目的源码和文档打包成JAR或其他格式,并将它们与构建产物一起部署到仓库。这样其他开发人员可以方便地获取源码和文档。

使用举例:

<artifactId>dynamic-data-source-demo</artifactId>
<name>dynamic-data-source-demo</name>
<packaging>jar</packaging>

<properties>
    <maven.compiler.source>8</maven.compiler.source>
    <maven.compiler.target>8</maven.compiler.target>
    <project.release.name>dynamic-data-source-demo</project.release.name>
    <dbscrpit.release.name>dynamic-db</dbscrpit.release.name>
    <project.release.version>1.0-SNAPSHOT</project.release.version>
    <project.container>java</project.container>
</properties>

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-deploy-plugin</artifactId>
      <version>3.0.0-M1</version>
      <configuration>
        <!-- 配置仓库信息 -->
        <repository>
          <id>my-repository</id>
          <url>https://example.com/repository</url>
          <username>my-username</username>
          <password>my-password</password>
        </repository>
      </configuration>
    </plugin>
  </plugins>
</build>

maven-install-plugin

Maven Install Plugin是Maven的一个插件,用于将项目构建产物(例如JAR、WAR或其他类型的文件)安装到本地仓库。它提供了一种方便的方式来在本地构建环境中使用构建产物作为依赖。

使用举例:

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-install-plugin</artifactId>
      <version>3.0.0-M1</version>
      <executions>
        <execution>
          <id>install-artifact</id>
          <phase>install</phase>
          <goals>
            <goal>install</goal>
          </goals>
          <configuration>
            <!-- 配置要安装的构建产物 -->
            <file>${project.build.directory}/my-artifact.jar</file>
            <!-- 配置要安装的附带源码 -->
            <sources>
              <source>${project.build.directory}/my-artifact-sources.jar</source>
            </sources>
            <!-- 配置要安装的附带文档 -->
            <javadoc>${project.build.directory}/my-artifact-javadoc.jar</javadoc>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

相关配置

最终配置完如下:

pom文件

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
        </resource>
    </resources>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>3.1.2</version>
            <configuration>
                <skipTests>true</skipTests>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>3.6.0</version>
            <configuration>
                <includeScope>runtime</includeScope>
            </configuration>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${project.build.directory}/lib</outputDirectory>
                        <excludeTransitive>false</excludeTransitive>
                        <stripVersion>false</stripVersion>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.3.0</version>
            <configuration>
                <archive>
                    <manifestEntries>
                        <Project-name>${project.name}</Project-name>
                        <Project-version>${project.release.name}-${project.release.version}</Project-version>
                        <Build-Time>${maven.build.timestamp} UTC</Build-Time>
                    </manifestEntries>
                </archive>
                <excludes>
                    <exclude>spring/**</exclude>
                    <exclude>sqlmap/**</exclude>
                    <exclude>*.xml</exclude>
                    <exclude>*.yml</exclude>
                </excludes>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>3.6.0</version>
            <configuration>
                <finalName>${project.release.name}</finalName>
                <appendAssemblyId>false</appendAssemblyId>
                <descriptors>
                    <descriptor>src/main/assembly/assembly.xml</descriptor>
                </descriptors>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-antrun-plugin</artifactId>
            <version>3.1.0</version>
            <executions>
                <execution>
                    <id>version</id>
                    <phase>prepare-package</phase>
                    <goals>
                        <goal>run</goal>
                    </goals>
                    <configuration>
                        <target>
                            <tstamp prefix="buildtime">
                                <format property="timeStamp" pattern="yyyy-MM-dd HH:mm:ss"/>
                            </tstamp>
                            <echo
                                    message="appName=${project.release.name}${line.separator}version=${project.release.version}${line.separator}container=${project.container}${line.separator}Build time=${buildtime.timeStamp}${line.separator}"
                                    file="${project.build.directory}/module.properties" append="false"/>
                            <mkdir dir="${project.build.directory}/lib/conf"/>
                        </target>
                    </configuration>
                </execution>
                <execution>
                    <id>rename</id>
                    <phase>package</phase>
                    <goals>
                        <goal>run</goal>
                    </goals>
                    <configuration>
                        <target>
                            <move file="${project.build.directory}/${project.release.name}.zip"
                                  tofile="${project.build.directory}/${project.release.name}-${project.release.version}.zip"/>
                            <zip
                                    destfile="${project.build.directory}/${dbscrpit.release.name}-DBSCRIPT-${project.release.version}.zip">
                                <fileset dir=".">
                                    <include name="db/**"/>
                                </fileset>
                            </zip>
                        </target>
                    </configuration>
                </execution>
            </executions>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-deploy-plugin</artifactId>
            <version>3.1.1</version>
            <configuration>
                <skip>true</skip>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-install-plugin</artifactId>
            <version>3.1.1</version>
            <configuration>
                <skip>true</skip>
            </configuration>
        </plugin>
    </plugins>
</build>

assembly.xml文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
    <id>demo</id>
    <formats>
        <format>zip</format>
    </formats>

    <includeBaseDirectory>false</includeBaseDirectory>
    <fileSets>
        <fileSet>
            <directory>src/main/bin</directory>
            <outputDirectory>bin</outputDirectory>
            <directoryMode>0750</directoryMode>
            <fileMode>0740</fileMode>
        </fileSet>
        <fileSet>
            <directory>target/lib</directory>
            <outputDirectory>lib/</outputDirectory>
            <includes>
                <include>**/**</include>
            </includes>
            <directoryMode>0750</directoryMode>
            <fileMode>0740</fileMode>
        </fileSet>
        <fileSet>
            <directory>target/classes</directory>
            <outputDirectory>lib/conf</outputDirectory>
            <includes>
                <include>spring/**</include>
                <include>sqlmap/**</include>
                <include>*.xml</include>
                <include>*.yml</include>
            </includes>
            <directoryMode>0750</directoryMode>
            <fileMode>0740</fileMode>
        </fileSet>
        <fileSet>
            <directory>target</directory>
            <outputDirectory/>
            <includes>
                <include>module.properties</include>
            </includes>
            <fileMode>0740</fileMode>
        </fileSet>
    </fileSets>
    <dependencySets>
        <dependencySet>
            <outputDirectory>lib</outputDirectory>
            <scope>runtime</scope>
            <includes>
                <include>${groupId}:${artifactId}</include>
            </includes>
            <fileMode>0640</fileMode>
        </dependencySet>
    </dependencySets>
</assembly>

打包效果

target目录: image.png

dynamic-data-source-demo-1.0-SNAPSHOT.zip如下: image.png

image.png

module.properties文件如下:

appName=dynamic-data-source-demo
version=1.0-SNAPSHOT
container=java
Build time=2023-10-01 13:52:34