序言
Maven的父子工程构建这种方式,或者说这个概念,也是在最近的项目中遇到了才了解。枉我写了这么多年的代码,同时也反映出自己对一些基础知识的缺失,趁着目前项目的需要,正好补充一下这个知识点。
目录
- 父子工程的构建步骤
正文
3.1 父子工程的构建步骤
下面的所有过程都是使用IDEA构建的,
- 父项目构建
对于父项目来说,只需要构建一个普通的Maven项目即可,步骤如下:
1.File -> New -> Project
2.选择Maven,直接点击Next按钮即可
3.填写项目相关的信息即可
4.到此,一个新的父Maven项目就新建成功了,目录结构以及初始的pom文件如下:
接下来,我们就需要根据项目需求,在父项目的pom中添加相关资源依赖的管理,下面我们按照spring-cloud项目依赖来举例。
5.添加spring-cloud的依赖管理,在pom文件中添加如下内容:
<packaging>pom</packaging>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
至此,父项目以及依赖就都完成了。接下来就是构建子项目了。
- 子项目的构建
- 子项目之common构建
在父项目中,我们添加了dependencyManagement标签统一引入了spring-boot和spring-cloud的依赖,它的好处是可以帮助我们管理依赖的版本号。
我们首先新建一个common项目,用来引入项目需要的资源依赖,这样可以避免子项目的重复引入问题。
新建一个Module即可,后续的步骤就不一一展示了,流程和父项目的步骤是一样的。
新建完成module后,目录结构、common以及父项目的pom文件如下:
我们会发现,在父项目的pom文件中,自动加入了modules标签项;同时common的pom中也自动引入了我们的parent。
我们在common的pom文件中加入spring-boot和spring-cloud的依赖,common的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">
<parent>
<artifactId>spring-cloud-yl-demo</artifactId>
<groupId>org.yl.springcloudyldemo</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>org.yl.springcloudyldemocommon</groupId>
<artifactId>spring-cloud-yl-demo-common</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<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>
</dependencies>
</project>
我们会发现,在dependency中,并没有版本version信息,这是因为由父项目统一来进行管理了,当然有一些依赖如果需要,会自动为我们带出正确的版本号。
- spring-boot项目构建nacos-provider
FIle->New-Module
选择Spring Initializr
填写相关的项目信息:
只选择Web里的这一项即可
完成nacos-provider项目的新建后,我们需要手动修改两项:
1.在父项目的pom文件中,添加一个module项,此时modules里面存在两项了,一个是我们刚才新建的common,一个是我们新建的nacos-provider项目:
2.修改nacos-provider项目的pom文件,因为我们建立的是spring-boot项目,所以默认会自动加入spring-boot的parent依赖,但是我们已经通过父项目来管理这一块了,所以我们把parent改成我们自己的父项目就可以,同时引入我们的common
修改前:
修改后:
修改后完整的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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.yl.springcloudyldemo</groupId>
<artifactId>spring-cloud-yl-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>orj.yl</groupId>
<artifactId>nacos-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>nacos-provider</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.yl.springcloudyldemocommon</groupId>
<artifactId>spring-cloud-yl-demo-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
此时,我们在父项目的目录下,执行mvn -U clean install,输出信息如下:
已经成功了,接下来,我们需要启动一下我们的nacos-provider项目。
不幸的是,项目并不能启动,报错如下:
提示我们spring-boot相关的包不存在,这就奇怪了,我们已经在common里面引入了,为啥不存在呢?
检查我们拉下来的依赖:
发现并没有我们的common,那么问题就很明显了,就是nacos-provider没有引用到我们的common,所以进而没有引用到其它的依赖。
我的解决方法:手动把common打包生成的jar加入到子项目中即可
关于这个问题试了网上的方法,并不能解决。
该如何解决,请大家留言告诉我,谢谢!
到此,我们的父子项目就构建完成了,可以按照相同的方法新建自己需要的多个子项目。