转载:https://blog.csdn.net/DamonREN/article/details/85091900#commentBox
因为之前用到的是,基于springboot框架所搭建的maven工程,而且都是相互独立的。现研发经理要求将所有工程进行整合和规范化,所以抽出一个parent父工程,base基础模块(包含一些公用的实体类和工具类等),以及其他子模块(Module A、 Module B ...)。Module A 以及Module B工程都需要依赖base工程。
问题:
在对Module A进行打包时,出现问题:Module A中所依赖的base工程的util程序包不存在。即使能打包成功,用java -jar启动jar包也会报Class Not Found,依赖的base工程的类找不到。
解决方案:
未解决之前在base工程的pom.xml中maven插件的配置如下:
-
<build>
-
<plugins>
-
<plugin>
-
<groupId>org.springframework.boot
</groupId>
-
<artifactId>spring-boot-maven-plugin
</artifactId>
-
</plugin>
-
</plugins>
-
</build>
解决base工程的pom.xml的maven配置如下:
-
<build>
-
<plugins>
-
<plugin>
-
<groupId>org.springframework.boot
</groupId>
-
<artifactId>spring-boot-maven-plugin
</artifactId>
-
<configuration>
-
<classifier>exec
</classifier>
-
</configuration>
-
</plugin>
-
</plugins>
-
</build>
原因分析:
spring-boot-maven-plugin打包出来的jar是不可依赖的
我们现在整合后的maven项目有一个parent工程,打包类型为pom,下面多个spring-boot工程作为它的module,分别为base和moduleA,moduleB。假如moduleA依赖于base。如果你在base中使用了spring-boot-maven-plugin的默认配置build,或者在parent工程中使用spring-boot-maven-plugin的默认配置build。那么在clean package的时候会发现moduleA找不到base中的类。原因就是默认打包出来的jar是不可依赖的。
解决方案:
官方告诉我们,你如果不想移代码,好吧,我这样来给你解决,给你打两个jar包,一个用来直接执行,一个用来依赖。于是,你需要指定一个属性classifier,这个属性为可执行jar包的名字后缀。比如我设置<classifier>exec</classifier>,原项目名为Vehicle-business。那么会得到两个jar:Vehicle-business.jar和Vehicle-bussiness-exec.jar
官方文档位置:84.5 Use a Spring Boot application as a dependency
总结:回到聚合maven上,如果你在parent工程中使用了spring-boot-maven-plugin作为builder,那么你的依赖module一定要用解决方案二来设置。否则你不在parent工程中用spring-boot-maven-plugin作为builder,而在需要打包的module上使用。
一般parent工程的maven插件配置如下:
-
<build>
-
<plugins>
-
<plugin>
-
<groupId>org.springframework.boot
</groupId>
-
<artifactId>spring-boot-maven-plugin
</artifactId>
-
<configuration>
-
<source>1.8
</source>
-
<target>1.8
</target>
-
</configuration>
-
<executions>
-
<execution>
-
<goals>
-
<goal>repackage
</goal>
-
</goals>
-
</execution>
-
</executions>
-
</plugin>
-
</plugins>
-
</build>
被依赖的maven子模块的maven插件配置如下(其余maven子模块就不需要配置):
-
<build>
-
<plugins>
-
<plugin>
-
<groupId>org.springframework.boot
</groupId>
-
<artifactId>spring-boot-maven-plugin
</artifactId>
-
<configuration>
-
<classifier>exec
</classifier>
-
</configuration>
-
</plugin>
-
</plugins>
-
</build>
其他的坑:
1.jdk8一定要指明
不指明的话在开发工具里运行没有一点问题,如果你没有用到java8的特性打包也没有问题。一旦你用到了java8的特性,而且使用spring-boot-maven-plugin作为builder,一定要指明jdk版本。不然你会收到类似不识别Lambda,请使用resource8这样的错误。
-
<properties>
-
<java.version>1.8
</java.version>
-
<maven.compiler.source>1.8
</maven.compiler.source>
-
<maven.compiler.target>1.8
</maven.compiler.target>
-
</properties>
2.BOOT-INF陷阱
这个问题就很恶心了。这个时候你已经打包成功,你会发现运行jar的时候报错为file not found,而且不告诉你是什么文件。你打开jar去看,发现需要的lib,配置文件,class一样也不缺。
其实这里要说一个概念,spring-boot在打包后,会把文件拷贝到BOOT-INF/Classes之下,这个时候你原来定义的扫描包路径将失效。而这个问题官方文档根本没讲,还是我没有看到。
这个陷阱在你使用packages定义扫描路径的时候等着你。或者获取工程下文件的时候。对于获取文件的话,可以在原路径前加上classes,当然你要区分开发环境或生产环境的话,你可以使用profile或者conditional来解决。如果是扫描包路径就恶心了,因为你加上classes之后,不报file not found了。而是不报错,只是警告你找不到hibernate的某些xml。但是你很可能根本没有使用hibernate。
参考博客:https://blog.csdn.net/guduyishuai/article/details/60968728
parent工程pom文件:
-
<?xml version="1.0" encoding="UTF-8"?>
-
<project xmlns="http://maven.apache.org/POM/4.0.0"
-
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
-
xsi:schemaLocation=
"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-
-
<modelVersion>4.0.0
</modelVersion>
-
-
<parent>
-
<groupId>org.springframework.boot
</groupId>
-
<artifactId>spring-boot-starter-parent
</artifactId>
-
<version>1.5.6.RELEASE
</version>
-
</parent>
-
-
<groupId>com.demo
</groupId>
-
<artifactId>demo-parent
</artifactId>
-
<packaging>pom
</packaging>
-
<version>1.0-SNAPSHOT
</version>
-
-
<modules>
-
<module>demo-base
</module>
-
<module>demo-sync
</module>
-
<module>demo-pattern
</module>
-
</modules>
-
-
<properties>
-
<project.build.sourceEncoding>UTF-8
</project.build.sourceEncoding>
-
<project.reporting.outputEncoding>UTF-8
</project.reporting.outputEncoding>
-
<java.version>1.8
</java.version>
-
<springboot.version>1.5.6
</springboot.version>
-
</properties>
-
-
<dependencies>
-
<dependency>
-
<groupId>org.springframework.boot
</groupId>
-
<artifactId>spring-boot-devtools
</artifactId>
-
</dependency>
-
<!--WEB层-->
-
<dependency>
-
<groupId>org.springframework.boot
</groupId>
-
<artifactId>spring-boot-starter-web
</artifactId>
-
</dependency>
-
-
<!--测试-->
-
<dependency>
-
<groupId>org.springframework.boot
</groupId>
-
<artifactId>spring-boot-starter-test
</artifactId>
-
</dependency>
-
<dependency>
-
<groupId>org.springframework.cloud
</groupId>
-
<artifactId>spring-cloud-starter-eureka
</artifactId>
-
</dependency>
-
<dependency>
-
<groupId>org.springframework.cloud
</groupId>
-
<artifactId>spring-cloud-starter-ribbon
</artifactId>
-
</dependency>
-
-
<dependency>
-
<groupId>org.springframework.boot
</groupId>
-
<artifactId>spring-boot-starter-actuator
</artifactId>
-
</dependency>
-
<!-- framework启动器 模板引擎 -->
-
<dependency>
-
<groupId>org.springframework.boot
</groupId>
-
<artifactId>spring-boot-starter-freemarker
</artifactId>
-
</dependency>
-
<dependency>
-
<groupId>redis.clients
</groupId>
-
<artifactId>jedis
</artifactId>
-
</dependency>
-
<dependency>
-
<groupId>org.springframework.data
</groupId>
-
<artifactId>spring-data-redis
</artifactId>
-
</dependency>
-
<dependency>
-
<groupId>org.springframework.boot
</groupId>
-
<artifactId>spring-boot-starter-redis
</artifactId>
-
<version>1.3.7.RELEASE
</version>
-
</dependency>
-
<dependency>
-
<groupId>org.springframework
</groupId>
-
<artifactId>spring-jdbc
</artifactId>
-
</dependency>
-
<dependency>
-
<groupId>org.springframework
</groupId>
-
<artifactId>spring-aspects
</artifactId>
-
</dependency>
-
<!-- Mybatis -->
-
<dependency>
-
<groupId>org.mybatis
</groupId>
-
<artifactId>mybatis
</artifactId>
-
<version>3.2.8
</version>
-
</dependency>
-
<dependency>
-
<groupId>org.mybatis
</groupId>
-
<artifactId>mybatis-spring
</artifactId>
-
<version>1.3.2
</version>
-
</dependency>
-
-
<!--fastjson-->
-
<dependency>
-
<groupId>com.alibaba
</groupId>
-
<artifactId>fastjson
</artifactId>
-
<version>1.2.8
</version>
-
</dependency>
-
<!-- 分页助手 -->
-
<dependency>
-
<groupId>com.github.pagehelper
</groupId>
-
<artifactId>pagehelper
</artifactId>
-
<version>3.7.5
</version>
-
</dependency>
-
<dependency>
-
<groupId>com.github.jsqlparser
</groupId>
-
<artifactId>jsqlparser
</artifactId>
-
<version>0.9.1
</version>
-
</dependency>
-
<!-- 通用Mapper -->
-
<dependency>
-
<groupId>com.github.abel533
</groupId>
-
<artifactId>mapper
</artifactId>
-
<version>2.3.4
</version>
-
</dependency>
-
<!-- MySql连接驱动 -->
-
<dependency>
-
<groupId>mysql
</groupId>
-
<artifactId>mysql-connector-java
</artifactId>
-
</dependency>
-
<!-- 连接池 -->
-
<dependency>
-
<groupId>com.jolbox
</groupId>
-
<artifactId>bonecp-spring
</artifactId>
-
<version>0.8.0.RELEASE
</version>
-
</dependency>
-
<dependency>
-
<groupId>org.springframework.boot
</groupId>
-
<artifactId>spring-boot-starter
</artifactId>
-
<exclusions>
-
<exclusion>
<!-- exclude掉spring-boot的默认log配置 -->
-
<groupId>org.springframework.boot
</groupId>
-
<artifactId>spring-boot-starter-logging
</artifactId>
-
</exclusion>
-
</exclusions>
-
</dependency>
-
<!-- log4j日志 -->
-
<dependency>
-
<groupId>org.springframework.boot
</groupId>
-
<artifactId>spring-boot-starter-log4j2
</artifactId>
-
</dependency>
-
-
<!-- 有其他jar依赖log4j -->
-
<dependency>
-
<groupId>org.apache.logging.log4j
</groupId>
-
<artifactId>log4j-1.2-api
</artifactId>
-
<version>2.8.2
</version>
-
</dependency>
-
-
<dependency>
-
<groupId>com.lmax
</groupId>
-
<artifactId>disruptor
</artifactId>
-
<version>3.3.6
</version>
-
</dependency>
-
-
<!-- https://mvnrepository.com/artifact/org.dom4j/dom4j -->
-
<dependency>
-
<groupId>org.dom4j
</groupId>
-
<artifactId>dom4j
</artifactId>
-
<version>2.1.0
</version>
-
</dependency>
-
-
<!--在线文档-->
-
<!--swagger本身不支持spring mvc的,springfox把swagger包装了一下,让他可以支持springmvc-->
-
<dependency>
-
<groupId>io.springfox
</groupId>
-
<artifactId>springfox-swagger2
</artifactId>
-
<version>2.6.1
</version>
-
</dependency>
-
<dependency>
-
<groupId>io.springfox
</groupId>
-
<artifactId>springfox-swagger-ui
</artifactId>
-
<version>2.6.1
</version>
-
</dependency>
-
</dependencies>
-
-
<dependencyManagement>
-
<dependencies>
-
<dependency>
-
<groupId>org.springframework.cloud
</groupId>
-
<artifactId>spring-cloud-dependencies
</artifactId>
-
<version>Camden.SR7
</version>
-
<type>pom
</type>
-
<scope>import
</scope>
-
</dependency>
-
</dependencies>
-
</dependencyManagement>
-
<build>
-
<plugins>
-
<!-- 资源文件拷贝插件 -->
-
<plugin>
-
<groupId>org.apache.maven.plugins
</groupId>
-
<artifactId>maven-resources-plugin
</artifactId>
-
<configuration>
-
<encoding>UTF-8
</encoding>
-
</configuration>
-
</plugin>
-
<!-- java编译插件 -->
-
<plugin>
-
<groupId>org.apache.maven.plugins
</groupId>
-
<artifactId>maven-compiler-plugin
</artifactId>
-
<configuration>
-
<source>1.8
</source>
-
<target>1.8
</target>
-
<encoding>UTF-8
</encoding>
-
</configuration>
-
</plugin>
-
<plugin>
-
<groupId>org.springframework.boot
</groupId>
-
<artifactId>spring-boot-maven-plugin
</artifactId>
-
</plugin>
-
</plugins>
-
</build>
-
-
</project>
base工程pom文件:
-
<?xml version="1.0" encoding="UTF-8"?>
-
<project xmlns="http://maven.apache.org/POM/4.0.0"
-
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
-
xsi:schemaLocation=
"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-
-
<artifactId>demo-base
</artifactId>
-
<modelVersion>4.0.0
</modelVersion>
-
-
<parent>
-
<groupId>com.demo
</groupId>
-
<artifactId>demo-parent
</artifactId>
-
<version>1.0-SNAPSHOT
</version>
-
</parent>
-
-
<build>
-
<plugins>
-
<plugin>
-
<groupId>org.springframework.boot
</groupId>
-
<artifactId>spring-boot-maven-plugin
</artifactId>
-
<configuration>
-
<classifier>exec
</classifier>
-
</configuration>
-
</plugin>
-
</plugins>
-
</build>
-
-
</project>
sync的pom文件:
-
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-
-
<artifactId>demo-sync
</artifactId>
-
<modelVersion>4.0.0
</modelVersion>
-
-
<parent>
-
<groupId>com.demo
</groupId>
-
<artifactId>demo-parent
</artifactId>
-
<version>1.0-SNAPSHOT
</version>
-
</parent>
-
-
<dependencies>
-
<dependency>
-
<groupId>com.demo
</groupId>
-
<artifactId>demo-base
</artifactId>
-
<version>1.0-SNAPSHOT
</version>
-
</dependency>
-
</dependencies>
-
-
</project>