1. 程式人生 > >idea建立springboot多模組專案

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。

avatar

二、點選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。如下所示:

avatar

三、點選Next,進入下一個選擇dependency的介面,作用是在pom中自動新增一些依賴,在專案開始時就下載。這裡我們暫時不勾選任何依賴。

四、點選Next,進入下一個介面,填寫工程名,並選擇工程所在目錄。填寫完成後,點選Finish,即可建立一個spring boot專案。

avatar

1.2 建立子模組

在上面建立好的CodeLearnAndPractice工程名上,點選右鍵,選擇New–>Module,進入New Module頁面。

該模組為dubbo服務的提供方,Name為springboot-dubbo-server,後面其他的引數都可參照父模組的引數設定。

avatar

下面建立另一個Module,dubbo服務的呼叫方,Name為springboot-dubbo-client,其他引數設定參照上步。

avatar

以上3個模組建立完成之後,整個專案的目錄結構如下圖所示。

我們把下圖選中的無用的檔案及資料夾刪掉,包括三個模組的mvnw、mvnw.cmd檔案及.mvn資料夾,還有父模組的src目錄,因為此處的父模組只做依賴管理,不需要編寫程式碼。

avatar

到這裡,一個父模組和兩個子模組都建立完成啦~~

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

 

    <groupId>com.practice</groupId>

    <artifactId>CodeLearnAndPractice</artifactId>

    <version>0.0.1-SNAPSHOT</version>

    <!--<packaging>jar</packaging>-->

    <packaging>pom</packaging>  <!--父模組打包型別必須為pom-->

 

    <modules>

        <module>springboot-dubbo-server</module>

        <module>springboot-dubbo-client</module>

    </modules>

 

    <name>CodeLearnAndPractice</name>

    <description>Practice the learned code</description>

 

    <!-- parent指明繼承關係,給出被繼承的父專案的具體資訊-->

    <parent>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-parent</artifactId>

        <version>1.5.8.RELEASE</version>

        <relativePath/>

        <!-- lookup parent from repository -->

    </parent>

 

    <properties>

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

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

        <java.version>1.8</java.version>

 

        <!-- 在properties中統一控制依賴包的版本,更清晰-->

        <dubbo.version>2.5.3</dubbo.version>

        <zkclient.version>0.10</zkclient.version>

    </properties>

 

    <dependencyManagement>   <!--dependencyManagement用於管理依賴版本號-->

        <dependencies>

            <!-- 刪除spring-boot-starter和spring-boot-starter-test,

            因為parent中繼承的祖先中已經有了,並且一般dependencyManagement管理的依賴都要寫版本號 -->

            <!--<dependency>-->

                <!--<groupId>org.springframework.boot</groupId>-->

                <!--<artifactId>spring-boot-starter</artifactId>-->

            <!--</dependency>-->

 

            <!--<dependency>-->

                <!--<groupId>org.springframework.boot</groupId>-->

                <!--<artifactId>spring-boot-starter-test</artifactId>-->

                <!--<scope>test</scope>-->

            <!--</dependency>-->

 

            <!--新增後續dubbo專案中所需依賴,dubbo、zk-->

            <dependency>

                <groupId>com.alibaba</groupId>

                <artifactId>dubbo</artifactId>

                <!--<version>2.5.3</version>-->    <!--使用properties中配置的版本號-->

                <version>${dubbo.version}</version>

                <exclusions>

                    <exclusion>

                        <groupId>org.springframework</groupId>

                        <artifactId>spring</artifactId>

                    </exclusion>

                </exclusions>

            </dependency>

 

            <dependency>

                <groupId>com.101tec</groupId>

                <artifactId>zkclient</artifactId>

                <!--<version>0.10</version>-->    <!--使用properties中配置的版本號-->

                <version>${zkclient.version}</version>

            </dependency>

        </dependencies>

 

    </dependencyManagement>

 

    <!--該外掛作用是打一個可執行的包,必須要寫在需要打包的專案裡。這裡的父模組不需要打包執行,所以刪掉該外掛。-->

    <!--<build>-->

        <!--<plugins>-->

            <!--<plugin>-->

                <!--<groupId>org.springframework.boot</groupId>-->

                <!--<artifactId>spring-boot-maven-plugin</artifactId>-->

            <!--</plugin>-->

        <!--</plugins>-->

    <!--</build>-->

 

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

 

   <groupId>com.practice</groupId>

   <artifactId>springboot-dubbo-server</artifactId>

   <version>0.0.1-SNAPSHOT</version>

   <packaging>jar</packaging>

 

   <name>springboot-dubbo-server</name>

   <description>Demo project for Spring Boot</description>

 

   <!-- 子模組的parent要使用頂層的父模組-->

   <parent>

      <!--<groupId>org.springframework.boot</groupId>-->

      <!--<artifactId>spring-boot-starter-parent</artifactId>-->

      <!--<version>1.5.8.RELEASE</version>-->

      <!--<relativePath/>-->

      <groupId>com.practice</groupId>

      <artifactId>CodeLearnAndPractice</artifactId>

      <version>0.0.1-SNAPSHOT</version>

   </parent>

 

   <!-- properties可刪掉,會繼承父模組的-->

   <!--<properties>-->

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

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

      <!--<java.version>1.8</java.version>-->

   <!--</properties>-->

 

   <dependencies>

      <dependency>

         <groupId>org.springframework.boot</groupId>

         <artifactId>spring-boot-starter</artifactId>

      </dependency>

 

      <dependency>

         <groupId>org.springframework.boot</groupId>

         <artifactId>spring-boot-starter-test</artifactId>

         <scope>test</scope>

      </dependency>

 

      <!--新增後續dubbo專案中所需依賴,dubbo、zk。

         父模組pom中使用dependencyManagement來管理依賴版本號,子模組pom中不需要再寫版本號,exclusion也不需要-->

      <dependency>

         <groupId>com.alibaba</groupId>

         <artifactId>dubbo</artifactId>

         <!--<version>2.5.3</version>-->

         <!--<exclusions>-->

            <!--<exclusion>-->

               <!--<groupId>org.springframework</groupId>-->

               <!--<artifactId>spring</artifactId>-->

            <!--</exclusion>-->

         <!--</exclusions>-->

      </dependency>

 

      <dependency>

         <groupId>com.101tec</groupId>

         <artifactId>zkclient</artifactId>

         <!--<version>0.10</version>-->

      </dependency>

   </dependencies>

 

   <build>

      <plugins>

         <plugin>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-maven-plugin</artifactId>

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

 

   <groupId>com.practice</groupId>

   <artifactId>springboot-dubbo-client</artifactId>

   <version>0.0.1-SNAPSHOT</version>

   <packaging>jar</packaging>

 

   <name>springboot-dubbo-client</name>

   <description>Demo project for Spring Boot</description>

 

   <!-- 子模組的parent要使用頂層的父模組-->

   <parent>

      <!--<groupId>org.springframework.boot</groupId>-->

      <!--<artifactId>spring-boot-starter-parent</artifactId>-->

      <!--<version>1.5.8.RELEASE</version>-->

      <!--<relativePath/>-->

      <groupId>com.practice</groupId>

      <artifactId>CodeLearnAndPractice</artifactId>

      <version>0.0.1-SNAPSHOT</version>

   </parent>

 

   <!-- properties可刪掉,會繼承父模組的-->

   <!--<properties>-->

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

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

      <!--<java.version>1.8</java.version>-->

   <!--</properties>-->

 

   <dependencies>

      <dependency>

         <groupId>org.springframework.boot</groupId>

         <artifactId>spring-boot-starter</artifactId>

      </dependency>

 

      <dependency>

         <groupId>org.springframework.boot</groupId>

         <artifactId>spring-boot-starter-test</artifactId>

         <scope>test</scope>

      </dependency>

 

      <!-- 該模組需要啟動web服務,需要該依賴-->

      <dependency>

         <groupId>org.springframework.boot</groupId>

         <artifactId>spring-boot-starter-web</artifactId>

      </dependency>

 

      <!--新增後續dubbo專案中所需依賴,dubbo、zk

         父模組pom中使用dependencyManagement來管理依賴版本號,子模組pom中不需要再寫版本號

         父模組pom中裡有exclusion,子模組pom中不要寫exclusion-->

      <dependency>

         <groupId>com.alibaba</groupId>

         <artifactId>dubbo</artifactId>

         <!--<version>2.5.3</version>-->

         <!--<exclusions>-->

            <!--<exclusion>-->

               <!--<groupId>org.springframework</groupId>-->

               <!--<artifactId>spring</artifactId>-->

            <!--</exclusion>-->

         <!--</exclusions>-->

      </dependency>

 

      <dependency>

         <groupId>com.101tec</groupId>

         <artifactId>zkclient</artifactId>

         <!--<version>0.10</version>-->

      </dependency>

 

      <!--client模組需要依賴server模組-->

      <dependency>

         <groupId>com.practice</groupId>

         <artifactId>springboot-dubbo-server</artifactId>

         <version>0.0.1-SNAPSHOT</version>

      </dependency>

   </dependencies>

 

   <build>

      <plugins>

         <plugin>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-maven-plugin</artifactId>

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

avatar

按住左鍵,然後點選父pom中的值,進入更上一層pom:

avatar

可以看到spring的版本是4.3.12:

avatar

3 測試

這裡就先不寫程式碼了,到下一章再寫。直接編譯一下,如果編譯成功,說明pom檔案的配置沒有什麼大問題。

點開右側Maven Projects,雙擊父模組Lifecycle中的compile,進行程式碼編譯,或者直接在Terminal中執行命令:mvn compile。

編譯通過啦~~

avatar

到這裡,Spring Boot多模組專案建立與配置就介紹完啦