优秀的编程知识分享平台

网站首页 > 技术文章 正文

Maven构建父子工程(maven 父工程)

nanyue 2024-08-19 19:02:06 技术文章 5 ℃

序言

Maven的父子工程构建这种方式,或者说这个概念,也是在最近的项目中遇到了才了解。枉我写了这么多年的代码,同时也反映出自己对一些基础知识的缺失,趁着目前项目的需要,正好补充一下这个知识点。

目录

  1. 父子工程的构建步骤

正文

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加入到子项目中即可

关于这个问题试了网上的方法,并不能解决。

该如何解决,请大家留言告诉我,谢谢!

到此,我们的父子项目就构建完成了,可以按照相同的方法新建自己需要的多个子项目。

最近发表
标签列表