多模块

在实际的springboot项目时,一般不会直接在新建的springboot工程中写逻辑代码,而是再新建Maven模块作为子模块,在子模块中去写代码。比如ruoyi-vue-pro项目:

img

图中粗字体的文件夹即表示一个子模块。

  • 删掉父工程的src文件夹
  • 在某个子模块中添加启动项

pom.xml配置文件

为了让各个子模块和父工程之间联系起来,需要利用pom.xml文件。

父工程的pom.xml文件:设置打包类型、管理依赖版本和公共依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
   <!-- 打包类型 -->
<packaging>pom</packaging>

<!-- 子模块有哪些 -->
<modules>
<module>yudao-dependencies</module>
<module>yudao-framework</module>
<module>yudao-server</module>
<module>yudao-module-member</module>
<!-- 。。。 -->
<!-- 。。。 -->
</modules>

<!-- 记录公共依赖和指定依赖版本 -->
<properties>
<revision>1.6.2-snapshot</revision>
<java.version>1.8</java.version>
<maven.compiler.source>${java.version}</maven.compiler.source>
</properties>

<!-- 配置< dependencyManagement>管理版本 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>cn.iocoder.boot</groupId>
<artifactId>yudao-dependencies</artifactId>
<version>${revision}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

构建springboot项目有两种方式:

第一种是继承spring-boot-starter-parent

第二种是通过dependencyManagement进行依赖管理

一般情况下,企业都有自己的parent依赖包,然后所有的项目都必须继承对应的parent包,这时候,我们就可以通过这种方式使用springboot,使用这种方式记得指定maven编译版本.

1
2
3
4
5
6
7
8
9
10
11
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

这两种方式,我们在pom中引入spring-boot-starter类的依赖时都不需要指定版本;

继承spring-boot-starter-parent其实也算是继承自spring-boot-dependencies,我们点开spring-boot-starter-parent,可以看到parent其实也是继承dependencies,parent里面就增加了一些插件,然后指定了maven编译版本:

在子模块的pom.xml中:指定父工程和当前子模块使用的依赖

1
2
3
4
5
6
<!-- 通过<parent>标签继承父工程下的pom.xml-->
<parent>
<groupId>cn.iocoder.boot</groupId>
<artifactId>yudao</artifactId>
<version>${revision}</version>
</parent>

驱动(如spring-boot-maven-plugin)只放在含启动类的子模块的pom文件中,此驱动必须要启动类,否则出错。不能放在父工程的pom中,会被其他没有启动类的子模块继承。

Maven

在打开一个新的项目时,Maven会解析pom.xml文件中配置的依赖。它会先从本地仓库中查找已下载的依赖,如果没有找到,会尝试从网络上下载:

  • Maven 中央仓库(默认):由 Maven 社区管理,其中包含了大量常用的库。要浏览中央仓库的内容,maven 社区提供了一个 URL。使用这个仓库,开发人员可以搜索所有可以获取的代码库。
  • 远程仓库:开发人员自己定制仓库,包含了所需要的代码库或者其他工程中用到的 jar 文件。 如果远程仓库没有被设置,Maven 将简单的停滞处理并抛出错误(无法找到依赖的文件)。

Idea自带一个Maven,可在File -> Settings -> Build, Execution, Deployment -> Build Tools -> Maven中查看。Idea自带maven的xml配置文件的位置: idea安装目录\plugins\maven\lib\maven3\conf\settings.xml。下载的jar包默认在C盘中,可以在其中去配置jar包的存储位置和镜像:

  • 修改jar包的存储位置:在配置文件中搜索 <localRepository>标签。

  • 修改镜像:中央仓库的位置在国外。在 <mirrors>标签内。

    1
    2
    3
    4
    5
    6
    7
    <!--有问题-->
    <mirror>
    <id>alimaven</id>
    <name>aliyun maven</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    <mirrorOf>central</mirrorOf>
    </mirror>

    或者在父工程的pom文件中添加:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <repositories>  
    <repository>
    <id>alimaven</id>
    <name>aliyun maven</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    <releases>
    <enabled>true</enabled>
    </releases>
    <snapshots>
    <enabled>false</enabled>
    </snapshots>
    </repository>
    </repositories>

其他:

多模块项目运行

下载好别人的项目,等待maven解析完成之后,运行报错,比如IDE能识别到某个类但显示无法加载,或者提示找不到启动类,可能在启动之前还需要做一些的工作。

以ruoyi-vue-pro项目为例,启动项目前需要依次将yudao-dependencies和yudao-framework两个模块中的jar包打包安装到本地Maven仓库。

“使用 IDEA 打开 Terminal 终端,在 根目录 下直接执行 mvn clean install package '-Dmaven.test.skip=true' 命令,将项目进行初始化的打包,然后再执行启动类。”

如果使用的是IDEA自带的maven,会显示无法识别 mvn,可以这样做:
img

启动还是报类不存在?

可能是 IDEA 的 bug,点击 [File -> Invalidate Caches] 菜单,清空下缓存,重启后在试试看。