下面是详细讲解“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技术站