欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

spring boot maven打包

程序员文章站 2022-04-23 11:55:59
...

spring boot自带了fat打包方式,但是我不太喜欢,于是改成用maven传统的压缩包发布方式
注意:这是非tomcat环境

源程序main目录结构
  1. java:源代码
  2. resources:资源
  3. assembly:打包配置
  4. bin:脚本程序
最终目录结构
  1. lib:依赖jar包
  2. 根目录:自身jar,其他脚本,配置文件
pom写法

build增加如下内容,包含需要打到jar里的内容,如内部配置、mybatis的mapper.xml等

<finalName>my-boot</finalName>
<resources>
		<resource>
			<directory>src/main/java</directory>
			<includes>
				<include>**/*.xml</include>
			</includes>
		</resource>
		<resource>
			<directory>src/main/resources</directory>
		</resource>
</resources>

plugins增加如下内容

<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-jar-plugin</artifactId>
				<version>2.4</version>
				<configuration>
					<archive>
						<manifest>
							<addClasspath>true</addClasspath>
							<classpathPrefix>lib/</classpathPrefix>
							<mainClass>com.github.xyhshen.boot.Application</mainClass>
						</manifest>
						<manifestEntries>
							<Class-Path>./</Class-Path>
						</manifestEntries>
					</archive>
					<excludes>
						<exclude>application.yaml</exclude>
						<exclude>bootstrap.yaml</exclude>
					</excludes>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId> maven-assembly-plugin </artifactId>
				<version>2.5.5</version>
				<configuration>
					<descriptors>
						<descriptor>src/main/assembly/assembly.xml</descriptor>
					</descriptors>
				</configuration>
				<executions>
					<execution>
						<id>spring-boot-assembly</id>
						<phase>package</phase>
						<goals>
							<goal>single</goal>
						</goals>
					</execution>
				</executions>
			</plugin>

其中manifest为主要jar的清单文件,这个文件非常重要,决定是否能够找到需要依赖的jar,mainClass为启动类,通过java -jar启动时会自动找清单里的配置项,classpathPrefix是依赖jar目录的前缀,这里放到同级目录的lib下,addClasspath为是否将当前的classpath作为一个依赖项添加添加到清单,如果有些文件是根据当前classpath位置进行查找,可以在这手动添加classpath路径,Class-Path为classpath的相对或绝对路径。
excludes用于剔除部分不想打到主jar包的内容,比如那些需要部署后才修改的配置文件
下面是assembly.xml,这是生成压缩包的重点

<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>release</id>
    <formats>
        <format>tar.gz</format>
    </formats>
    <includeBaseDirectory>true</includeBaseDirectory>
    <dependencySets>
        <dependencySet>
            <unpack>false</unpack>
            <scope>runtime</scope>
            <outputDirectory>lib</outputDirectory>
            <useProjectArtifact>false</useProjectArtifact>
        </dependencySet>
    </dependencySets>
    <fileSets>
        <fileSet>
            <directory>${project.build.directory}</directory>
            <outputDirectory></outputDirectory>
            <includes>
                <include>*.jar</include>
            </includes>
        </fileSet>
        <fileSet>
            <directory>${project.basedir}/src/main/resources</directory>
            <outputDirectory></outputDirectory>
            <includes>
                <include>*.yaml</include>
            </includes>
        </fileSet>
        <fileSet>
            <directory>${project.basedir}/src/main/bin</directory>
            <outputDirectory></outputDirectory>
            <includes>
                <include>*.sh</include>
            </includes>
        </fileSet>
    </fileSets>
</assembly>

其中dependencySets用于配置依赖项,这里把全部的依赖jar输出到lib下,与前面pom的classpath/lib相呼应
fileSets设置将哪些内容打入压缩包,这里选择了jar本身和其他部署后会修改的配置文件
includeBaseDirectory为是否在压缩包建立一个同名的目录作为根目录用于放置包里的内容,这块是否设置要考虑部署的方式。
id为打包的后缀
formats决定输出的压缩包有哪些格式,可以是zip,gz、tar等
然后编写两个用于启动和停止的文件,linux为sh windows为bat,这里只提供linux
startup.sh

#!/bin/bash
nohup java -jar my-boot.jar >run.out 2>&1 & echo $! > pid

stop.sh

#!/bin/bash
kill -9 `cat pid`

这些文件放在bin下面,其中的jar请自行替换成自己的文件
最后就可以打包了

mvn clean package -DskipTests

使用的时候可以直接unzip或tar -zxf解压,然后cd到目录直接运行startup.sh启动,使用stop.sh停止,如果shell有错误,可能是windows下作了修改,有编码问题

如果启动出现依赖错误,可能是部分依赖包,如guava有版本冲突问题,记得加exclusion踢掉低级版本就行