这篇文章参考了多篇博客,总结了父工程、含有启动类的子工程、不含启动类的子工程、含有mapper的子工程等多种形式的pom.xml配置及打包方式。
1.1 项目结构
该项目是一个pom聚合项目
1.2 在父工程的pom.xml中加上
<packaging>pom</packaging>表示打包方式为聚合项目。build直接覆盖原来的build即可。
<packaging>pom</packaging>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<skipTests>true</skipTests> <!--默认关掉单元测试 -->
</configuration>
</plugin>
</plugins>
</build>
1.3 在含有启动类的子工程中
含有启动类的子工程,需要指定启动类地址,打包完成后执行jar包就是执行该启动类。
<packaging>jar</packaging>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!-- 指定该Main Class为全局的唯一入口 这里是启动类的地址 -->
<mainClass>org.javaboy.vhr.VhrApplication</mainClass>
<layout>ZIP</layout>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal><!--可以把依赖的包都打包到生成的Jar包中-->
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
1.4 不含有启动类的子工程中
不含启动类的子工程,在中取消生成jar包,否则在使用maven进行打包的时候,一直提示“程序包xxx不存在,找不到符号”
<packaging>jar</packaging>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
1.5 含有mapper的子工程
因为mapper.xml文件是在resource目录下,在打包时候可能不会加载进去,需要将mapper.xml文件加载进去,否则在执行jar包的时候,会报org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)映射文件找不到的错误。如下所示的配置中,<plugins>...</plugins>部分表示打包时不生成jar包,<resources>....</resources>表示加载mapper.xml文件。
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
<!-- 如果不添加此节点mybatis的mapper.xml文件都会被漏掉。 -->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
我项目中的mapper在的工程中不含启动类,所以配置如上图,有些人的项目中mapper和启动类在一个工程中,把<resources>....</resources>部分复制过去即可。案例如下
<packaging>jar</packaging>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!-- 指定该Main Class为全局的唯一入口 这里是启动类的地址 -->
<mainClass>org.javaboy.vhr.VhrApplication</mainClass>
<layout>ZIP</layout>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal><!--可以把依赖的包都打包到生成的Jar包中-->
</goals>
</execution>
</executions>
</plugin>
</plugins>
<!-- 如果不添加此节点mybatis的mapper.xml文件都会被漏掉。 -->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
1.6生成jar包
测试生成的jar文件是否正常执行,新建空文件,将jar包复制进去。直接在上面cmd回车进入窗口。
执行java -jar xxxx.jar
浏览器访问,访问成功。我这里是已启动前端,可以直接登录到自己的项目。没有前端的自己浏览器输入自己后端的访问地址或者在postman中测试即可。