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日

相关文章

  • mybatis if传入字符串数字踩坑记录及解决

    下面是详细讲解 mybatis if 传入字符串数字踩坑记录及解决的完整攻略。 问题描述 在使用 MyBatis 执行动态 SQL 语句时,我们使用 <if> 标签来使 SQL 语句更加灵活。在某些情况下,我们需要在 \ 中传入字符串数字,例如: <select id="getUserById" parameterTyp…

    Java 2023年5月27日
    00
  • Java中的集合框架是什么?

    Java中的集合框架是一个内置的数据结构库,它提供了一组接口和类,用于处理和管理元素的类集合。Java集合框架有助于开发人员以更高效、更灵活和更可扩展的方式处理复杂数据。 Java集合框架中的类和接口被组织成三个主要的继承层次结构:Collection、Map 和 Iterator。其中,Collection是表示一组对象的根接口,Map是表示一组键值对(k…

    Java 2023年4月27日
    00
  • java/jsp中 中文问题详解

    Java/JSP 中文问题详解 背景 在 Java/JSP 开发中,中文字符集编码问题经常会遇到。由于 Java 内部使用的是 UTF-16 编码,而 HTTP 协议传输数据时常使用的是 UTF-8 编码,所以在处理中文字符时,需要进行字符集编码转换。 常见问题 URL 参数传递问题 由于 HTTP 协议传输 URL 数据时使用的是 ASCII 编码,因此中…

    Java 2023年5月20日
    00
  • Java之理解多态详解

    Java之理解多态详解 什么是多态 多态是指同样的消息可以被不同的对象接收和处理。 在实现时,一个父类的变量可以引用一个子类的对象,这个引用既可以调用父类中定义的方法,也可以调用子类中重写父类方法的方法。 多态的实现需要满足三个条件: 继承:多态必须存在于父类和子类之间. 重写:在子类中对父类的方法进行重新定义. 向上转型:使用父类类型的引用指向子类对象. …

    Java 2023年5月26日
    00
  • java过滤器中Filter的ChainFilter过滤链

    Java过滤器(Filter)可以用于拦截Web应用程序中的请求和响应,FilterChain(Filter链)则是一组过滤器,处理请求,并将请求和响应转发到下一个过滤器,最终传递给Servlet或JSP页面。 FilterChain的作用主要有两个: 1.按照指定的顺序传递请求和响应对象; 2.在所有的过滤器执行完毕之后,将请求和响应对象传递给Servle…

    Java 2023年6月15日
    00
  • 如何使用Java运行期注解?

    准备工作: 在本地电脑上安装Java开发环境,确保可以运行Java程序。 Step 1:定义注解 在Java中,定义注解需要使用@interface关键字,如下所示: public @interface MyAnnotation { String value(); } 其中,@interface是用来声明一个注解的关键字,MyAnnotation是注解的名称…

    Java 2023年5月11日
    00
  • SpringBoot 整合Jest实例代码讲解

    让我们开始讲解“SpringBoot 整合Jest实例代码讲解”的完整攻略。 1. 简介 Jest是一个基于Java的全文搜索引擎库,具有快速、可扩展和易于使用的特点。而Spring Boot是目前非常流行的一款Java Web框架,其提供了开箱即用的特性,可以快速搭建Web应用程序。 在本文中,我们将介绍如何使用Spring Boot整合Jest,并提供两…

    Java 2023年5月26日
    00
  • htm调用JS代码

    当HTML页面引入JavaScript(JS)文件并调用JS代码时,可以通过以下步骤实现: 在HTML文件中使用标签引入JS文件。在HTML中使用标签时,需要指定src属性来引入JS文件。 例如,在如下HTML页面中,通过引入“script.js”文件实现JS代码的调用: <!DOCTYPE html> <html lang="e…

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