SSM(十) 項目重構-互聯網項目的Maven結構
前言
很久沒有更新博客了,之前定下周更逐漸成了月更。怎么感覺像我追過的一部動漫。 這個博文其實很早就想寫了。 之前所有的代碼都是在一個模塊里面進行開發,這和maven的理念是完全不相符的,最近硬是抽了一個時間來對項目的結構進行了一次重構。
前言
很久沒有更新博客了,之前定下周更逐漸成了月更。怎么感覺像我追過的一部動漫。 這個博文其實很早就想寫了。 之前所有的代碼都是在一個模塊里面進行開發,這和maven的理念是完全不相符的,最近硬是抽了一個時間來對項目的結構進行了一次重構。
先來看看這次重構之后的目錄結構
為什么需要分模塊
至于為什么要分模塊呢?
我們設想一個這樣的場景: 在現在的互聯網開發中,會把一個很大的系統拆分成各個子系統用于降低他們之間的耦合度。
在一個子項目中通常都會為API
、WEB
、Service
等模塊。 而且當項目夠大時,這些通常都不是一個人能完成的工作,需要一個團隊來各司其職。
想象一下:當之前所有的項目都在一個模塊的時候,A改動了API,需要Deploy
代碼。而B也改動了service
的代碼,但并沒有完全做完。所以A在提交build
的時候就會報錯
而且在整個項目足夠大的時候,這個build
的時間也是很影響效率的。
但讓我將各個模塊之間分開之后效果就不一樣了。我修改了API
我就只需要管我的就行,不需要整個項目進行build
。
而且當有其他項目需要依賴我這個API
的時候也只需要依賴API
即可,不用整個項目都依賴過去。
各個模塊的作用
來看下這次我所分的模塊。
ROOT
這是整個項目的根節點。 先看一下其中的pom.xml
:
- <groupId>com.crossoverJie</groupId>
- <artifactId>SSM</artifactId>
- <packaging>pom</packaging>
- <version>2.0.0</version>
- <modules>
- <module>SSM-API</module>
- <module>SSM-BOOT</module>
- <module>SSM-SERVICE</module>
- <module>SSM-WEB</module>
- </modules>
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <spring.version>4.1.4.RELEASE</spring.version>
- <jackson.version>2.5.0</jackson.version>
- <lucene.version>6.0.1</lucene.version>
- </properties>
- <dependencyManagement>
- <dependencies>
- <dependency>
- <groupId>com.crossoverJie</groupId>
- <artifactId>SSM-API</artifactId>
- <version>2.0.0</version>
- </dependency>
- </dependencies>
- </dependencyManagement>
我截取了其中比較重點的配置。
由于這是父節點,所以我的packag
類型使用的是pom
。 其中分別有著四個子模塊。
其中重點看下<dependencyManagement>
這個標簽。 如果使用的是IDEA
這個開發工具的話是可以看到如下圖:
標紅的有一個向下的箭頭,點一下就可以進入子模塊中相同的依賴。 這樣子模塊就不需要配置具體的版本了,統一由父模塊來進行維護,對之后的版本升級也帶來了好處。
SSM-API
接下來看下API
這個模塊:
通常這個模塊都是用于定義外部接口的,以及改接口所依賴的一些DTO類
。 一般這個模塊都是拿來給其他項目進行依賴,并和本項目進行數據交互的。
SSM-BOOT
BOOT
這個模塊比較特殊。 可以看到這里沒有任何代碼,只有一個rpc
的配置文件。 通常這個模塊是用于給我們內部項目進行依賴的,并不像上面的API
模塊一樣給其他部門或者是項目進行依賴的。
因為在我們的RPC
調用的時候,用dubbo
來舉例,是需要配置所依賴的consumer
。
但如果是我們自己內部調用的話我們就可以把需要調用自己的dubbo
服務提供者配置在這里,這樣的話我們自己調用就只需要依賴這個BOOT
就可以進行調用了。
哦對了,BOOT
同時還會依賴API
,這樣才實現了只依賴BOOT
就可以調用自己內部的dubbo
服務了。 如下所示:
- <dependencies>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>com.crossoverJie</groupId>
- <artifactId>SSM-API</artifactId>
- </dependency>
- </dependencies>
SSM-SERVICE
SERVICE
模塊就比較好理解了。 是處理具體業務邏輯的地方,也是對之前的API的實現。
通常這也是一個web
模塊,所以我的pom
類型是WAR
。
SSM-WEB
其實WEB
模塊和SERVICE
模塊有點重合了。通常來說這個模塊一般在一個對外提供http
訪問接口的項目中。
這里只是為了展示項目結構,所以也寫在了這里。
他的作用和service
差不多,都是WAR
的類型。
總結
這次沒有實現什么特別的功能,只是對一些還沒有接觸過這種項目結構開發的童鞋能起到一些引導作用。
具體源碼還請關注我的github
。
項目地址:https://github.com/crossoverJie/SSM.git
個人博客地址:http://crossoverjie.top。
GitHub地址:https://github.com/crossoverJie。
先來看看這次重構之后的目錄結構
為什么需要分模塊
至于為什么要分模塊呢?
我們設想一個這樣的場景: 在現在的互聯網開發中,會把一個很大的系統拆分成各個子系統用于降低他們之間的耦合度。
在一個子項目中通常都會為API
、WEB
、Service
等模塊。 而且當項目夠大時,這些通常都不是一個人能完成的工作,需要一個團隊來各司其職。
想象一下:當之前所有的項目都在一個模塊的時候,A改動了API,需要Deploy
代碼。而B也改動了service
的代碼,但并沒有完全做完。所以A在提交build
的時候就會報錯
而且在整個項目足夠大的時候,這個build
的時間也是很影響效率的。
但讓我將各個模塊之間分開之后效果就不一樣了。我修改了API
我就只需要管我的就行,不需要整個項目進行build
。
而且當有其他項目需要依賴我這個API
的時候也只需要依賴API
即可,不用整個項目都依賴過去。
各個模塊的作用
來看下這次我所分的模塊。
ROOT
這是整個項目的根節點。 先看一下其中的pom.xml
:
<groupId>com.crossoverJie</groupId> <artifactId>SSM</artifactId> <packaging>pom</packaging> <version>2.0.0</version> <modules> <module>SSM-API</module> <module>SSM-BOOT</module> <module>SSM-SERVICE</module> <module>SSM-WEB</module> </modules> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <spring.version>4.1.4.RELEASE</spring.version> <jackson.version>2.5.0</jackson.version> <lucene.version>6.0.1</lucene.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>com.crossoverJie</groupId> <artifactId>SSM-API</artifactId> <version>2.0.0</version> </dependency> </dependencies> </dependencyManagement>
我截取了其中比較重點的配置。
由于這是父節點,所以我的packag
類型使用的是pom
。 其中分別有著四個子模塊。
其中重點看下<dependencyManagement>
這個標簽。 如果使用的是IDEA
這個開發工具的話是可以看到如下圖:
標紅的有一個向下的箭頭,點一下就可以進入子模塊中相同的依賴。 這樣子模塊就不需要配置具體的版本了,統一由父模塊來進行維護,對之后的版本升級也帶來了好處。
SSM-API
接下來看下API
這個模塊:
通常這個模塊都是用于定義外部接口的,以及改接口所依賴的一些DTO類
。 一般這個模塊都是拿來給其他項目進行依賴,并和本項目進行數據交互的。
SSM-BOOT
BOOT
這個模塊比較特殊。 可以看到這里沒有任何代碼,只有一個rpc
的配置文件。 通常這個模塊是用于給我們內部項目進行依賴的,并不像上面的API
模塊一樣給其他部門或者是項目進行依賴的。
因為在我們的RPC
調用的時候,用dubbo
來舉例,是需要配置所依賴的consumer
。
但如果是我們自己內部調用的話我們就可以把需要調用自己的dubbo
服務提供者配置在這里,這樣的話我們自己調用就只需要依賴這個BOOT
就可以進行調用了。
哦對了,BOOT
同時還會依賴API
,這樣才實現了只依賴BOOT
就可以調用自己內部的dubbo
服務了。 如下所示:
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.crossoverJie</groupId> <artifactId>SSM-API</artifactId> </dependency> </dependencies>
SSM-SERVICE
SERVICE
模塊就比較好理解了。 是處理具體業務邏輯的地方,也是對之前的API的實現。
通常這也是一個web
模塊,所以我的pom
類型是WAR
。
SSM-WEB
其實WEB
模塊和SERVICE
模塊有點重合了。通常來說這個模塊一般在一個對外提供http
訪問接口的項目中。
這里只是為了展示項目結構,所以也寫在了這里。
他的作用和service
差不多,都是WAR
的類型。
總結
這次沒有實現什么特別的功能,只是對一些還沒有接觸過這種項目結構開發的童鞋能起到一些引導作用。
具體源碼還請關注我的github
。
項目地址:https://github.com/crossoverJie/SSM.git
個人博客地址:http://crossoverjie.top。
GitHub地址:https://github.com/crossoverJie。