在idea中創建多模塊的SpringBoot項目
首先,了解下maven項目的三種打包方式:
1.war
打包為war包項目時,可以放在tomcat下運行
2.jar
打包成jar包就是要使用java -jar xxx.jar
方式來運行,最常見的就是SpringBoot項目
3.pom
它只是用來做依賴管理,打包成的項目並不能直接運行。比如Springboot項目的父依賴以及再住上的依賴打包方式就是pom,因為它們只做依賴管理。
開始創建項目
總共創建三個module,分別為lyn4ever-web,lyn4ever-service,lyn4ever-dao。就這樣做一個最簡單的框架
1.第一步,創建父工程
1.1直接創建一個springboot項目(為了方便,當然普通的maven項目也可以,當你看懂原理后,隨意玩),什么也不需要
這一步只需要選擇對應的版本就可以了,其他的可選可不選
1.2刪除這個項目下的src文件夾,因為我們並不會在這里寫代碼
1.3在pom.xml中添加<packaging>pom</packaging>
這一句
2.第二步,在剛才這個項目的根文件夾上鼠標右鍵,new->module->選擇maven項目
-
一定要在剛才這個項目的根文件夾上創建,因為這樣它會自動為我們寫好依賴關系(pom依賴關系),不然還要自己寫.這時注意選擇它的父依賴,如果沒有就點擊右邊按紐選擇剛才創建的modulepackage
-
注意選擇好在磁盤上的文件夾目錄,默認情況下是正確的,直接跳過就好了.
-
idea自動為我們在父項目的pom文件中添加了如下一句
而且,也可以看到,這個web項目的父依賴就是剛才創建的modulepackage項目
3.第三步,這個web的項目就創建好了,我們就將這個子項目做為項目入口,即寫一個springboot的啟動類,只有這一個項目要寫,其他的不用寫.
package cn.lyn4ever.web.boot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
- 作為web層,我們還要引入springboot-web的依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
4.創建service子項目
和上一個一樣,new->module->maven然后寫好名字.接着在web項目中添加這個service的依賴,在web中的pom.xml中添加如下依賴:
<dependency>
<groupId>cn.lyn4ever</groupId>
<artifactId>service</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
5.創建dao子項目
同樣,也是創建子maven項目,但是這個dao層要連接數據庫,我們就要引入mybatis和mysql相關依賴(由於我們最上一層用的是springboot依賴,所以完全可以引入mybatis依賴)。
- 這些相關依賴可以引入到modulepackage的pom文件中,也可以引入到子模塊中。我個人建議引入到子模塊中,因為它並不是所有的子模塊通用的,但是還是要使用父工程來管理這些依賴,怎么辦?那就使用dependencyManagement,如果不明白這個做法的原理的小伙伴,請戳dependencies與dependencyManagement的區別
- dao模塊中的依賴
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
- service層要依賴dao層,請在service的pom中添加依賴
<dependency>
<groupId>cn.lyn4ever</groupId>
<artifactId>dao</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
- 在idea右邊的maven管理中可以完全看到它們之間的依賴關系
6.工程已經創建好了,我們就開始與代碼進行測試吧。
- 和我們通常寫代碼是一樣的,web,service,dao層,請自行補全。(代碼已上傳到gitee,隨時查看項目源代碼地址)
7.進行測試
7.1寫好代碼后運行Application.main()時報錯
說明@Service沒有掃描到, 所以沒有這個bean,在Application.java上添加掃描注解@ComponentScan("cn.lyn4ever")
上邊錯就是說明掃描到mapper,加上注解@MapperScan("cn.lyn4ever.dao")
幾個說明:
- 如果創建Springboot項目時報錯,說無法訪問
https://start.spring.io,請看這里idea中使用Spring Initializr創建項目時報錯
*最后啟動這個項目(使用我們之前寫的Application.mian)啟動,使用瀏覽器訪問成功.
8.最重要的部分,打包上線和多人協作的情況處理
8.1 打包上線:
首先,你要明白。我們這么折騰了好一會兒,到底做了個什么?
-
service和dao模塊其實就是一個被依賴的項目,真正的項目是web這個模塊。
-
所以,我們只需要打包web模塊就可以了,但是web模塊依賴service,service依賴dao。
-
maven中的所謂的依賴,就是要在倉庫中尋找依賴。所以我們要先將service和dao這兩個模塊install到本地maven倉庫中(只有這樣,在打包web模塊時,才能正確找到依賴,先dao,再service)。
如果報錯如下
------------------------------------------------------------------------
[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.2.2.RELEASE:repackage (repackage) on project dao: Execution repackage of goal org.springframework.boot:spring-boot-maven-plugin:2.2.2.RELEASE:repackage failed: Unable to find main class -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/PluginExecutionException
將父項目中的這段代碼復制到web模塊中,因為這上sprinboot項目打包的插件。
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
當然,為了避免出現不必要的錯誤,我更建議直接對modulepackage這個父項目進行install
依次對dao和service執行了install后,可以在本地maven倉庫中找到它們:
然后對web模塊進行打包,打包完成后,會在它的target文件夾下生成jar文件,我們運行這上jar文件
java -jar web-0.0.1-SNAPSHOT.jar
然后這個項目就可以上線了。
8.2多人協作時
我們使用壓縮包的方式打開上邊這個打包好的jar包,可以在里邊找到剛才的service和dao打包成的jar包
也就是說,在對we模塊打包時,是將本地倉庫中的maven倉庫中的service和dao的jar包打包了進去,如果是多人協作的話,最好創建一個maven私服,這樣就會更加方便
- 總結:
- 1.在實際工作中,肯定不止一個web,service,dao。請在命名時做到見名知義。
- 2.除了web層,其他的子模塊最終會被打包成jar包,放在web包中,只需要運行這一個jar包就可以了
- 3.父工程的打包方式一定要是pom,即
<packaging>pom</packaging>