maven assembly打包生成Java应用启动脚本bat和sh的方法

下面是详细讲解“maven assembly打包生成Java应用启动脚本bat和sh的方法”的完整攻略。

1. 简介

Maven 是一个基于项目对象模型(POM),可以通过一小段描述文件来管理项目的构建、报告和文档的工具。Maven assembly插件为开发者提供了制作可独立运行的发行版(Distribution)的能力,可以通过配置在项目构建时产生必要的文件。此外,该插件还能够根据指定的 XML 配置文件,打包生成指定格式的启动脚本。

2. Maven Assembly 打包方法

2.1 安装 Maven Assembly 插件

pom.xml 中添加 maven-assembly-plugin 插件,指定版本号,如下:

<build>
  <plugins>
    <plugin>
      <artifactId>maven-assembly-plugin</artifactId>
      <version>3.3.0</version>
      <configuration>
         <descriptorRefs>
             <descriptorRef>jar-with-dependencies</descriptorRef>
         </descriptorRefs>
         <archive>
             <manifest>
              <mainClass>com.example.MainClass</mainClass>
             </manifest>
         </archive>
      </configuration>
      <executions>
         <execution>
             <id>make-assembly</id>
             <phase>package</phase>
             <goals>
                 <goal>single</goal>
             </goals>
         </execution>
      </executions>
   </plugin>
  </plugins>
</build>

2.2 添加 assembly.xml 文件

Maven Assembly 插件需要配置一个 assembly.xml 文件,该文件位于项目的 src/main/assembly/ 目录下,用于指导插件创建补丁文件以及提交它们到指定的目录中。
该文件可以指定生成的发行版的名称、类型、所依赖的 JAR 包的处理树形结构以及类似的东西。

assembly.xml 文件示例:

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                  xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
      <id>bin</id>
      <formats>
          <format>zip</format>
      </formats>
      <baseDirectory>/</baseDirectory>
      <fileSets>
          <fileSet>
              <directory>${project.build.directory}</directory>
              <outputDirectory>/</outputDirectory>
              <includes>
                  <include>${project.artifactId}-${project.version}.jar</include>
              </includes>
          </fileSet>
      </fileSets>
      <dependencySets>
          <dependencySet>
              <outputDirectory>/lib</outputDirectory>
              <useProjectArtifact>false</useProjectArtifact>
              <useTransitiveFiltering>true</useTransitiveFiltering>
              <includes>
                  <include>${project.groupId}:${project.artifactId}:jar:${project.version}</include>
              </includes>
          </dependencySet>
      </dependencySets>
</assembly>

以上 assembly.xml 文件的定义,生成的发行版名称叫做 bin.zip,所依赖的 JAR 包存储在 lib 目录下。

  • id 设置此 assembly.xml 文件的 id
  • formats 指定生成的发行版包格式,此处为 zip 格式。
  • baseDirectory 设定生成的包的基础目录。这里 / 表示系统根目录。
  • fileSets 定义需要打入生成包的文件目录。
  • outputDirectory 设置将文件打入发行版的相对目录。/ 表示系统根目录。
  • includes 定义过滤条件以确定匹配要打入发行版的文件。匹配文件使用 Ant 风格的模式识别,也可以使用通配符。
  • dependencySets 通过此元素指定项目的依赖关系。
  • useProjectArtifact 控制插件是否包含项目中间产物。

2.3 执行命令生成启动脚本

执行命令:mvn clean package,则在 target/ 目录下生成一个可执行的带有所有依赖包的 jar 文件和一个 bin.zip 文件。
其中,bin.zip 中的内容即为以 assembly.xml 文件为配置参数打包生成的发行版文件。

2.4 发行版文件解压至指定目录

将生成的支持包文件 bin.zip 解压至指定目录,如 /usr/local/app,那么解压后的目录结构应为:

app/
 |-- bin/
      |-- *.bat
      |-- *.sh
      |-- *.jar
 |-- lib/
      |-- *.jar

其中,bin 目录包含 .bat.sh 两个启动脚本,lib 目录包含所有的依赖包。

2.5 示例一

一个示例项目和使用 assembly.xml 文件的配置如下:

  • pom.xml 文件:
<build>
  <plugins>
    <plugin>
      <artifactId>maven-assembly-plugin</artifactId>
      <version>3.3.0</version>
      <executions>
        <execution>
          <id>create-start-scripts</id>
          <phase>package</phase>
          <goals>
            <goal>single</goal>
          </goals>
          <configuration>
            <archive>
              <manifest>
                <mainClass>com.example.Main</mainClass>
              </manifest>
            </archive>
            <descriptorRefs>
              <descriptorRef>jar-with-dependencies</descriptorRef>
            </descriptorRefs>
            <descriptors>
              <descriptor>assembly.xml</descriptor>
            </descriptors>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>
  • assembly.xml 文件:
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="
          http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0
          http://maven.apache.org/xsd/assembly-1.1.0.xsd">
  <id>launcher</id>
  <formats>
    <format>tar.gz</format>
  </formats>
  <includeBaseDirectory>true</includeBaseDirectory>
  <dependencySets>
    <dependencySet>
      <outputDirectory>lib</outputDirectory>
      <useProjectArtifact>false</useProjectArtifact>
      <useTransitiveDependencies>false</useTransitiveDependencies>
    </dependencySet>
  </dependencySets>
  <fileSets>
    <fileSet>
      <directory>${project.build.directory}</directory>
      <outputDirectory>/</outputDirectory>
      <fileMode>0755</fileMode>
      <includes>
        <include>*.jar</include>
      </includes>
    </fileSet>
    <fileSet>
      <directory>src/main/resources</directory>
      <outputDirectory>/</outputDirectory>
      <fileMode>0755</fileMode>
      <includes>
        <include>*.properties</include>
      </includes>
    </fileSet>
  </fileSets>
  <binaries>
    <binary>
      <excludeDependencies>true</excludeDependencies>
      <outputDirectory>bin</outputDirectory>
      <sources>
        <source>
          <directory>${basedir}/src/main/scripts/unix</directory>
          <outputDirectory>/</outputDirectory>
          <includes>
            <include>*.sh</include>
          </includes>
          <fileMode>0755</fileMode>
        </source>
        <source>
          <directory>${basedir}/src/main/scripts/windows</directory>
          <outputDirectory>/</outputDirectory>
          <includes>
            <include>*.bat</include>
          </includes>
        </source>
      </sources>
    </binary>
  </binaries>
</assembly>

运行命令 mvn clean package,在 target/ 目录下会生成一个 *.tar.gz 文件和一个 *.jar 文件。

将压缩包解压后所在文件夹的结构如下所示:

example/
    ├── bin
    │   ├── example.bat
    │   └── example.sh
    ├── lib
    │   ├── some-lib.jar
    │   └── some-other-lib.jar
    ├── example.jar
    └── some-file.properties

该项目可以在 UNIX/Linux 和 Windows 系统中启动,并可以使用 .sh.bat 文件启动。

2.6 示例二

另一个使用 assembly.xml 文件的示例,配置文件如下:

  • pom.xml 文件:
<build>
  <plugins>
    <plugin>
      <artifactId>maven-assembly-plugin</artifactId>
      <version>3.3.0</version>
      <configuration>
        <archive>
          <manifest>
            <mainClass>com.example.Main</mainClass>
          </manifest>
        </archive>
        <descriptorRefs>
          <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <descriptors>
          <descriptor>assembly.xml</descriptor>
        </descriptors>
      </configuration>
      <executions>
        <execution>
          <id>make-dist</id>
          <phase>package</phase>
          <goals>
            <goal>single</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>
  • assembly.xml 文件:
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.1"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="
            http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.1
            http://maven.apache.org/xsd/assembly-1.1.1.xsd">
    <id>complete</id>

    <formats>
        <format>tar.gz</format>
    </formats>

    <fileSets>
        <fileSet>
            <directory>${basedir}/lib</directory>
            <outputDirectory>lib</outputDirectory>
            <includes>
                <include>*.jar</include>
            </includes>
        </fileSet>
        <fileSet>
            <directory>${basedir}</directory>
            <outputDirectory>bin</outputDirectory>
            <includes>
                <include>*.sh</include>
            </includes>
            <fileMode>0755</fileMode>
        </fileSet>
    </fileSets>
</assembly>

运行命令 mvn clean package,在 target/ 目录下会生成一个 *.tar.gz 文件和一个 *.jar 文件。

将压缩包解压后所在文件夹的结构如下所示:

example/
    ├── bin
    │   └── example.sh
    ├── lib
    │   ├── some-lib.jar
    │   └── some-other-lib.jar
    │
    └── example.jar

该项目可以在 UNIX/Linux 中启动,可以使用 .sh 文件启动。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:maven assembly打包生成Java应用启动脚本bat和sh的方法 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • 解读Spring事务是如何实现的

    下面是关于解读Spring事务实现的攻略。 什么是Spring事务? Spring事务是一种管理数据库事务的机制。Spring提供了一种将事务管理到服务层的方式,从而统一处理事务。它提供了在事务中进行数据操作的方法,当操作失败时,能够自动将已经对数据库做出的更改撤销。 Spring如何管理事务? Spring管理事务的核心是通过AOP,即面向切面编程,将调用…

    Java 2023年5月20日
    00
  • Spring源码解析之编程式事务

    Spring源码解析之编程式事务 什么是编程式事务 编程式事务是通过编写代码来实现事务控制。在编程式事务中,开发者不仅仅需要实现业务逻辑,还需要手动管理事务的开始、提交或回滚。这种方式相对于声明式事务来说,显得更加灵活,但也需要开发者编写更多的代码。 Spring中的编程式事务 Spring框架提供了TransactionTemplate接口和Platfor…

    Java 2023年5月20日
    00
  • 命令提示符编译java的方法(必看篇)

    命令提示符编译Java的方法 要在命令提示符中编译Java程序,我们需要进行以下步骤: 第一步:设置Java环境变量 为了让命令提示符识别Java编译,我们需要先设置Java环境变量。 在桌面上右键点击“计算机”,然后选择“属性”; 点击“高级系统设置”; 点击“环境变量”; 在“系统变量”中,选择“新建”; 在“变量名”中输入“JAVA_HOME”,在“变…

    Java 2023年5月23日
    00
  • 详解Java如何进行Base64的编码(Encode)与解码(Decode)

    当我们需要在网络上传输二进制数据时,常常需要将数据进行Base64编码。Java中提供了基础库,实现Base64编码非常方便。本文将详细讲解Java如何进行Base64的编码和解码。 Java Base64编码 在Java中,Base64编码可以使用Java标准库Java.util.Base64完成。具体步骤如下: 将待编码的数据转换为字节数组; 创建Bas…

    Java 2023年5月20日
    00
  • Java 读写Properties配置文件详解

    Java 读写Properties配置文件详解 什么是Properties文件? Properties文件是一种配置文件,常用于存储程序中需要的各种参数信息,可以被Java程序轻松地读写。Properties文件通常以”.properties”为后缀名,且文件内容为键值对的形式。 Properties文件的读写 读取Properties文件 读取Proper…

    Java 2023年5月20日
    00
  • java application maven项目打自定义zip包实例(推荐)

    下面是“Java Application Maven项目打自定义zip包实例”的详细攻略。 简述 在程序的开发过程中,通常需要将代码及其附属资源打包为可执行的程序或库,并进行发布和分发。Maven是一个非常流行的Java包管理工具,可以通过Maven来打包生成自定义的zip包。 步骤 创建Maven项目 首先需要创建一个简单的Maven项目。使用Maven …

    Java 2023年5月20日
    00
  • Java之ThreadPoolExecutor类详解

    Java之ThreadPoolExecutor类详解 简介 ThreadPoolExecutor是Java中一个非常强大的线程池类。它允许我们执行任务时只需关注任务本身,而不用关心线程的创建和管理过程。同时,ThreadPoolExecutor提供了许多配置选项,以便我们根据需要对线程池进行调优。 类构造 ThreadPoolExecutor类的构造函数有以…

    Java 2023年5月19日
    00
  • SpringBoot 枚举类型的自动转换的实现

    关于Spring Boot枚举类型的自动转换实现,我们可以从以下几个方面进行讲解: 1.枚举类型的定义 在Spring Boot应用中,我们可以通过Java中的枚举类型来定义一个特定的常量集合,例如: public enum Color { RED, GREEN, BLUE; } 2.自动转换的实现 Spring Boot通过Type Conversion …

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部