公司新项目需使用java技术栈,便使用IDEA搭建了一个多SpringBoot项目的聚合工程,因为初次使用,遇到了很多问题,maven打包时各种报错,在网上查了好多终于解决了,为巩固记忆,特作此记录。
一、先记录一下创建父子工程一些需要注意的地方:
1.创建父子工程
在IDEA中使用Spring Initializr的方式创建SpringBoot工程,GroupId为域.公司名,例如com.company,Artifact为项目名,例如testproject,主要注意父子项目保持组名一致
父项目创建好后,将.mvm、src文件夹,mvnw、mvnw.cmd文件直接删除,并修改pom.xml的packaging更改为pom。
2.创建子工程
选中父项目,鼠标右键,然后点击New—>Module,同样方式创建SpringBoot工程,注意项目的保存路径要加上'\子项目名',否则项目工程会乱掉
3.修改子项目的pom.xml文件,将其中的parent更改为对应父项目的信息,如下:
4.父项目的pom.xml中增加modules节点,并增加新增的子项目
5.添加依赖引用
一般情况下是,在父项目的pom.xml中用dependencyManagement统一版本管理,子项目中根据需要自行声明引用。
如下:
父项目pom.xml的properties中声明jar包版本号
<dependencyManagement>
<dependencies>
<!-- SpringBoot的依赖配置-->
<dependency>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.4.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency> <!--阿里数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${druid.version}</version>
</dependency> <!--Token生成与解析-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>${jwt.version}</version>
</dependency> <!--验证码 -->
<dependency>
<groupId>com.github.penggle</groupId>
<artifactId>kaptcha</artifactId>
<version>${kaptcha.version}</version>
</dependency> .... <!-- 通用工具-->
<dependency>
<groupId>com.loxaump</groupId>
<artifactId>loxaump-common</artifactId>
<version>${loxaump.version}</version>
</dependency> </dependencies>
</dependencyManagement>
dependencyManagement依赖声明
子项目中声明所需引用,为防止子项目引用时,因为依赖jar包版本不一致,导致打包时找不到对应jar包错误(maven本地中会自动下载有依赖的版本),尽量子项目中不单独声明版本号。
<dependencies>
<!-- Spring框架基本的核心工具 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency> <!-- SpringWeb模块 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency> <!-- spring security 安全认证 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency> ....
</dependencies>
子项目dependencies
二、maven打包时报错 程序包不存在
父子项目创建好后,使用maven工具
其他的子项目依赖common项目,打包后,明明正常打好了common的jar包,在maven本地仓中也能找到对应的版本,但是在打其他项目时,仍会提示程序包 com.loxaump.common.service.contants不存在等一系列类找不到。
如下图所示:
解决方法:
SpringBoot打成jar包我们一般使用spring-boot-maven-plugin这个插件,当配置了该插件后,运行“mvn package”进行打包时,会打包成一个可以直接运行的 JAR 文件,使用“java -jar”命令就可以直接运行。
1.因为spring-boot-maven-plugin在打成jar包时会默认找public static void main(String[] args){***}方法,这时候如果项目有多个main方法,就有问题了,需要删掉其他的main方法,只留SpringBoot的入口main方法,或者在pom.xml中用start-class属性指定项目main方法:
2..将父项目ROOT中的spring-boot-maven-plugin更换成org.apache.maven.plugins
更改为:
encoding即为:UTF-8
修改后,在重新打包,问题解决。
补充
如果打包时,报错:Cannot resolve xxx.xxx.xxx-xxx:unknown等错误时,应该是本地maven仓库中存在多个版本的jar包,并且因为其他原因导致某个jar包下载失败,这时,就到本地仓将jar包的文件夹删除,重新使用maven打包下载即可。