springBoot打包项目时,有时需要引用jar直接是文件形式,而不是maven依赖,此时可以两种打包方式:
- 运行jar包和项目依赖分开打包,运行时通过命令指定依赖所在目录
- 打成一个整包,依赖也包含进去
如果要打成完整的包,maven需要做一些配置,简单记录如下:
1 spring-boot-maven-plugin 插件指定运行的主函数所在的类,及springboot的启动类
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<executable>true</executable>
<!--增加jvm参数-->
<jvmArguments>-Dfile.encoding=UTF-8</jvmArguments>
<!-- 指定SpringBoot程序的main函数入口类 -->
<mainClass>com.fmi110.wx.AppApiApplication</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<classifier>exec</classifier>
</configuration>
</execution>
</executions>
</plugin>
2 添加插件 maven-compiler-plugin ,并指定外部依赖 jar 文件所在的目录(这步可以不用)
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<compilerArguments>
<!-- 打包本地jar包 -->
<extdirs>${project.basedir}/lib</extdirs>
</compilerArguments>
</configuration>
</plugin>
上述配置外部jar位于项目根目录的 lib 目录,如下图
3 在 build 标签下添加 resources 标签,并指定需要打包的资源文件
<resources>
<!-- 将当前libs目录下的所有jar包含到BOOT-INF/lib/目录下 -->
<resource>
<directory>lib</directory>
<targetPath>BOOT-INF/lib/</targetPath>
<includes>
<include>**/*.jar</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.yml</include>
<include>**/*.properties</include>
<include>**/*</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
</includes>
<!--防止yml中引用pom文件定义的变量失效,引用形式 @profile.active@ -->
<filtering>true</filtering>
</resource>
</resources>
这里通过 resource 标签,指定了jar包所在的目录,路径使用了相对路径,位于当前目录的lib文件夹下,如图
同时需要指定打包的配置文件和静态资源文件,否则这些文件将不会被打包,导致启动失败。
如果yml文件中,使用如下形式引用pom文件中定义的变量,在 resource 标签必须添加 <filtering>true</filtering> 属性,否则引用失败,可能导致项目配置出错
做好上述配置后,就可以正常打包,并使用 java -jar xxx.jar 启动了