idea创建springboot多模块项目

最近在负责的是一个比较复杂项目,模块很多,代码中的二级模块就有9个,部分二级模块下面还分了多个模块。代码中的多模块是用maven管理的,每个模块都使用spring boot框架。之前有零零散散学过一些maven多模块配置的知识,但没自己从头到尾创建和配置过,也快忘得差不多了。这次正好对照着这个项目,动手实践一下,下面我们就开始吧。

maven多模块项目通常由一个父模块和若干个子模块构成,每个模块都对应着一个pom.xml。它们之间通过继承和聚合(也称作多模块)相互关联。多模块适用于一些比较大的项目,通过合理的模块拆分,实现代码的复用,便于维护和管理。

1 多模块项目创建

因为本系列的下一篇是《Spring Boot集成Dubbo》,所以本章就以创建多模块的dubbo项目作为示例。示例中的开发环境是Win 7,编辑器是Intellij IDEA,Java版本是1.8。

1.1 父模块创建

首先我们在IDEA中创建一个spring boot工程作为父项目。

一、在界面左上角选择File->New->Project后,选择Spring Initializr,默认使用的Java版本是1.8。

idea创建springboot多模块项目_第1张图片

二、点击Next,进入下一步,可以设置项目的一些基本信息。

这里我们先来温习下groupId、artifactId、package这三个参数的一般填写规范。

groupId和artifactId统称为“坐标”,是为了保证项目唯一性而提出的。groupId是项目组织唯一的标识符,实际对应JAVA的包的结构,ArtifactID是项目的唯一的标识符,实际对应项目的名称,就是项目根目录的名称。groupId一般分为多个段,一般第一段为域,第二段为公司名称。举个apache公司的tomcat项目例子:这个项目的groupId是org.apache,它的域是org,公司名称是apache,artifactId是tomcat。包结构package最好是以groupId.artifactId打头的。

因为后续打算将“代码学习和实践”写成一个系列的文章,文中演示的工程都作为该工程的子模块,所以这里项目名Name就填写CodeLearnAndPractice。

这里是个人练习的项目,不涉及公司名,但groupId、artifactId、package参数的填写,还是尽量按照上面的规范来填写,这里package就直接用groupId.artifactId。如下所示:

idea创建springboot多模块项目_第2张图片

三、点击Next,进入下一个选择dependency的界面,作用是在pom中自动添加一些依赖,在项目开始时就下载。这里我们暂时不勾选任何依赖。

四、点击Next,进入下一个界面,填写工程名,并选择工程所在目录。填写完成后,点击Finish,即可创建一个spring boot项目。

idea创建springboot多模块项目_第3张图片

1.2 创建子模块

在上面创建好的CodeLearnAndPractice工程名上,点击右键,选择New–>Module,进入New Module页面。

该模块为dubbo服务的提供方,Name为springboot-dubbo-server,后面其他的参数都可参照父模块的参数设置。

idea创建springboot多模块项目_第4张图片

下面创建另一个Module,dubbo服务的调用方,Name为springboot-dubbo-client,其他参数设置参照上步。

idea创建springboot多模块项目_第5张图片

以上3个模块创建完成之后,整个项目的目录结构如下图所示。

我们把下图选中的无用的文件及文件夹删掉,包括三个模块的mvnw、mvnw.cmd文件及.mvn文件夹,还有父模块的src目录,因为此处的父模块只做依赖管理,不需要编写代码。

idea创建springboot多模块项目_第6张图片

到这里,一个父模块和两个子模块都创建完成啦~~

2 多模块项目配置

2.1 父模块pom配置

父pom是为了抽取统一的配置信息和依赖版本控制,方便子pom直接引用,简化子pom的配置。

下面介绍下父pom的配置中需要注意的一些地方。我贴出的pom看起来会有点冗余,因为其中一些不需要的地方,我没有直接删掉而是注释掉,并加了说明,是为了后续查看的时候还能清楚删掉的原因。

1、父模块的打包类型

多模块项目中,父模块打包类型必须是pom,同时以给出所有的子模块,其中每个module,都是另外一个maven项目。

我们的项目中目前一共有两个子模块,springboot-dubbo-server和springboot-dubbo-client。后续新增的子模块也必须加到父pom的modules中。

2、继承设置

继承是maven中很强大的一种功能,继承可以使子pom获得parent中的各项配置,对子pom进行统一的配置和依赖管理。父pom中的大多数元素都能被子pom继承,想深入了解的同学可自行搜索学习~~

maven项目之间的继承关系通过表示。这里使用的开发框架是spring boot,默认继承spring-boot-starter-parent。

3、使用dependencyManagement管理依赖版本号

一般在项目最顶层的父pom中使用该元素,让所有子模块引用一个依赖而不用显式的列出版本号。maven会沿着父子层次向上走,直到找到一个拥有dependencyManagement元素的项目,然后它就会使用在这个dependencyManagement元素中指定的版本号。

4、使用properties控制依赖包的版本号,便于版本维护

在properties标签中,添加各依赖包的版本号,然后在dependency中直接引用该依赖版本号的值即可。

CodeLearnAndPractice/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

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

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.0modelVersion>

 

    <groupId>com.practicegroupId>

    <artifactId>CodeLearnAndPracticeartifactId>

    <version>0.0.1-SNAPSHOTversion>

    

    <packaging>pompackaging>  

 

    <modules>

        <module>springboot-dubbo-servermodule>

        <module>springboot-dubbo-clientmodule>

    modules>

 

    <name>CodeLearnAndPracticename>

    <description>Practice the learned codedescription>

 

    

    <parent>

        <groupId>org.springframework.bootgroupId>

        <artifactId>spring-boot-starter-parentartifactId>

        <version>1.5.8.RELEASEversion>

        <relativePath/>

        

    parent>

 

    <properties>

        <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>

        <project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>

        <java.version>1.8java.version>

 

        

        <dubbo.version>2.5.3dubbo.version>

        <zkclient.version>0.10zkclient.version>

    properties>

 

    <dependencyManagement>   

        <dependencies>

            

            

                

                

            

 

            

                

                

                

            

 

            

            <dependency>

                <groupId>com.alibabagroupId>

                <artifactId>dubboartifactId>

                    

                <version>${dubbo.version}version>

                <exclusions>

                    <exclusion>

                        <groupId>org.springframeworkgroupId>

                        <artifactId>springartifactId>

                    exclusion>

                exclusions>

            dependency>

 

            <dependency>

                <groupId>com.101tecgroupId>

                <artifactId>zkclientartifactId>

                    

                <version>${zkclient.version}version>

            dependency>

        dependencies>

 

    dependencyManagement>

 

    

    

        

            

                

                

            

        

    

 

project>

 

2.2 子模块pom配置

1、继承设置

子模块的parent要使用顶层的父模块.

2、依赖设置

父模块pom中使用dependencyManagement来管理的依赖,在子模块pom中就不需要再写版本号了,exclusion元素也不需要再写。

springboot-dubbo-server\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

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

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.0modelVersion>

 

   <groupId>com.practicegroupId>

   <artifactId>springboot-dubbo-serverartifactId>

   <version>0.0.1-SNAPSHOTversion>

   <packaging>jarpackaging>

 

   <name>springboot-dubbo-servername>

   <description>Demo project for Spring Bootdescription>

 

   

   <parent>

      

      

      

      

      <groupId>com.practicegroupId>

      <artifactId>CodeLearnAndPracticeartifactId>

      <version>0.0.1-SNAPSHOTversion>

   parent>

 

   

   

      

      

      

   

 

   <dependencies>

      <dependency>

         <groupId>org.springframework.bootgroupId>

         <artifactId>spring-boot-starterartifactId>

      dependency>

 

      <dependency>

         <groupId>org.springframework.bootgroupId>

         <artifactId>spring-boot-starter-testartifactId>

         <scope>testscope>

      dependency>

 

      

      <dependency>

         <groupId>com.alibabagroupId>

         <artifactId>dubboartifactId>

         

         

            

               

               

            

         

      dependency>

 

      <dependency>

         <groupId>com.101tecgroupId>

         <artifactId>zkclientartifactId>

         

      dependency>

   dependencies>

 

   <build>

      <plugins>

         <plugin>

            <groupId>org.springframework.bootgroupId>

            <artifactId>spring-boot-maven-pluginartifactId>

         plugin>

      plugins>

   build>

 

project>

 

springvoot-dubbo-client/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

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

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.0modelVersion>

 

   <groupId>com.practicegroupId>

   <artifactId>springboot-dubbo-clientartifactId>

   <version>0.0.1-SNAPSHOTversion>

   <packaging>jarpackaging>

 

   <name>springboot-dubbo-clientname>

   <description>Demo project for Spring Bootdescription>

 

   

   <parent>

      

      

      

      

      <groupId>com.practicegroupId>

      <artifactId>CodeLearnAndPracticeartifactId>

      <version>0.0.1-SNAPSHOTversion>

   parent>

 

   

   

      

      

      

   

 

   <dependencies>

      <dependency>

         <groupId>org.springframework.bootgroupId>

         <artifactId>spring-boot-starterartifactId>

      dependency>

 

      <dependency>

         <groupId>org.springframework.bootgroupId>

         <artifactId>spring-boot-starter-testartifactId>

         <scope>testscope>

      dependency>

 

      

      <dependency>

         <groupId>org.springframework.bootgroupId>

         <artifactId>spring-boot-starter-webartifactId>

      dependency>

 

      

      <dependency>

         <groupId>com.alibabagroupId>

         <artifactId>dubboartifactId>

         

         

            

               

               

            

         

      dependency>

 

      <dependency>

         <groupId>com.101tecgroupId>

         <artifactId>zkclientartifactId>

         

      dependency>

 

      

      <dependency>

         <groupId>com.practicegroupId>

         <artifactId>springboot-dubbo-serverartifactId>

         <version>0.0.1-SNAPSHOTversion>

      dependency>

   dependencies>

 

   <build>

      <plugins>

         <plugin>

            <groupId>org.springframework.bootgroupId>

            <artifactId>spring-boot-maven-pluginartifactId>

         plugin>

      plugins>

   build>

 

project>     

 

3、关于exclusions标签

当dependency A自身的依赖B,与其他dependency存在冲突的时候(最常见的就是版本冲突),我们就需要把B排除掉,这时就需要使用exclusions元素。

那么我们怎么知道一个dependency自身包含哪些依赖呢?
1、通过mvn dependency:tree命令查看依赖树
2、使用IDEA或其他IDA查看依赖树

点击IDEA右侧的Maven Projects,在每个模块的Dependencies中即可查看每个dependency内部的依赖及版本号,从来识别哪些依赖需要被排除掉。

以dubbo为例,我们先删除配置,点开Maven Projects,可以看到2.5.3版本的dubbo中使用的spring版本是2.5.6,这是一个很老的版本,有一些方法是没有的,现在在用的spring版本一般都是4.*的,所以我们需要把它排除掉,避免后续报错。

要查看当前项目中使用的spring版本,可以按住左键,然后点击父pom中的值,进入更上一层pom,再重复上步操作,可以看到spring的版本是4.3.12。

idea创建springboot多模块项目_第7张图片

按住左键,然后点击父pom中的值,进入更上一层pom:

idea创建springboot多模块项目_第8张图片

可以看到spring的版本是4.3.12:

avatar

3 测试

这里就先不写代码了,到下一章再写。直接编译一下,如果编译成功,说明pom文件的配置没有什么大问题。

点开右侧Maven Projects,双击父模块Lifecycle中的compile,进行代码编译,或者直接在Terminal中执行命令:mvn compile。

编译通过啦~~

idea创建springboot多模块项目_第9张图片

到这里,Spring Boot多模块项目创建与配置就介绍完啦

你可能感兴趣的:(idea创建springboot多模块项目)