在idea中創(chuàng)建多模塊的SpringBoot項(xiàng)目
首先,了解下maven項(xiàng)目的三種打包方式:
1.war
打包為war包項(xiàng)目時(shí),可以放在tomcat下運(yùn)行
2.jar
打包成jar包就是要使用java -jar xxx.jar方式來運(yùn)行,最常見的就是SpringBoot項(xiàng)目
3.pom
它只是用來做依賴管理,打包成的項(xiàng)目并不能直接運(yùn)行。比如Springboot項(xiàng)目的父依賴以及再住上的依賴打包方式就是pom,因?yàn)樗鼈冎蛔鲆蕾嚬芾怼?/p>
開始創(chuàng)建項(xiàng)目
總共創(chuàng)建三個(gè)module,分別為lyn4ever-web,lyn4ever-service,lyn4ever-dao。就這樣做一個(gè)最簡單的框架
1.第一步,創(chuàng)建父工程
1.1直接創(chuàng)建一個(gè)springboot項(xiàng)目(為了方便,當(dāng)然普通的maven項(xiàng)目也可以,當(dāng)你看懂原理后,隨意玩),什么也不需要
這一步只需要選擇對(duì)應(yīng)的版本就可以了,其他的可選可不選
1.2刪除這個(gè)項(xiàng)目下的src文件夾,因?yàn)槲覀儾⒉粫?huì)在這里寫代碼
1.3在pom.xml中添加<packaging>pom</packaging>這一句
2.第二步,在剛才這個(gè)項(xiàng)目的根文件夾上鼠標(biāo)右鍵,new->module->選擇maven項(xiàng)目
-
一定要在剛才這個(gè)項(xiàng)目的根文件夾上創(chuàng)建,因?yàn)檫@樣它會(huì)自動(dòng)為我們寫好依賴關(guān)系(pom依賴關(guān)系),不然還要自己寫.這時(shí)注意選擇它的父依賴,如果沒有就點(diǎn)擊右邊按紐選擇剛才創(chuàng)建的modulepackage
-
注意選擇好在磁盤上的文件夾目錄,默認(rèn)情況下是正確的,直接跳過就好了.
-
idea自動(dòng)為我們?cè)诟疙?xiàng)目的pom文件中添加了如下一句
而且,也可以看到,這個(gè)web項(xiàng)目的父依賴就是剛才創(chuàng)建的modulepackage項(xiàng)目
3.第三步,這個(gè)web的項(xiàng)目就創(chuàng)建好了,我們就將這個(gè)子項(xiàng)目做為項(xiàng)目入口,即寫一個(gè)springboot的啟動(dòng)類,只有這一個(gè)項(xiàng)目要寫,其他的不用寫.
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.創(chuàng)建service子項(xiàng)目
和上一個(gè)一樣,new->module->maven然后寫好名字.接著在web項(xiàng)目中添加這個(gè)service的依賴,在web中的pom.xml中添加如下依賴:
<dependency>
<groupId>cn.lyn4ever</groupId>
<artifactId>service</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
5.創(chuàng)建dao子項(xiàng)目
同樣,也是創(chuàng)建子maven項(xiàng)目,但是這個(gè)dao層要連接數(shù)據(jù)庫,我們就要引入mybatis和mysql相關(guān)依賴(由于我們最上一層用的是springboot依賴,所以完全可以引入mybatis依賴)。
- 這些相關(guān)依賴可以引入到modulepackage的pom文件中,也可以引入到子模塊中。我個(gè)人建議引入到子模塊中,因?yàn)樗⒉皇撬械淖幽K通用的,但是還是要使用父工程來管理這些依賴,怎么辦?那就使用dependencyManagement,如果不明白這個(gè)做法的原理的小伙伴,請(qǐng)戳dependencies與dependencyManagement的區(qū)別
- 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層,請(qǐng)?jiān)趕ervice的pom中添加依賴
<dependency>
<groupId>cn.lyn4ever</groupId>
<artifactId>dao</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
-
在idea右邊的maven管理中可以完全看到它們之間的依賴關(guān)系
6.工程已經(jīng)創(chuàng)建好了,我們就開始與代碼進(jìn)行測試吧。
- 和我們通常寫代碼是一樣的,web,service,dao層,請(qǐng)自行補(bǔ)全。(代碼已上傳到gitee,隨時(shí)查看項(xiàng)目源代碼地址)
7.進(jìn)行測試
7.1寫好代碼后運(yùn)行Application.main()時(shí)報(bào)錯(cuò)
說明@Service沒有掃描到, 所以沒有這個(gè)bean,在Application.java上添加掃描注解@ComponentScan("cn.lyn4ever")
上邊錯(cuò)就是說明掃描到mapper,加上注解@MapperScan("cn.lyn4ever.dao")
幾個(gè)說明:
- 如果創(chuàng)建Springboot項(xiàng)目時(shí)報(bào)錯(cuò),說無法訪問
https://start.spring.io,請(qǐng)看這里idea中使用Spring Initializr創(chuàng)建項(xiàng)目時(shí)報(bào)錯(cuò)
*最后啟動(dòng)這個(gè)項(xiàng)目(使用我們之前寫的Application.mian)啟動(dòng),使用瀏覽器訪問成功.
8.最重要的部分,打包上線和多人協(xié)作的情況處理
8.1 打包上線:
首先,你要明白。我們這么折騰了好一會(huì)兒,到底做了個(gè)什么?
service和dao模塊其實(shí)就是一個(gè)被依賴的項(xiàng)目,真正的項(xiàng)目是web這個(gè)模塊。
所以,我們只需要打包web模塊就可以了,但是web模塊依賴service,service依賴dao。
-
maven中的所謂的依賴,就是要在倉庫中尋找依賴。所以我們要先將service和dao這兩個(gè)模塊install到本地maven倉庫中(只有這樣,在打包web模塊時(shí),才能正確找到依賴,先dao,再service)。
如果報(bào)錯(cuò)如下
------------------------------------------------------------------------
[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
將父項(xiàng)目中的這段代碼復(fù)制到web模塊中,因?yàn)檫@上sprinboot項(xiàng)目打包的插件。
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
當(dāng)然,為了避免出現(xiàn)不必要的錯(cuò)誤,我更建議直接對(duì)modulepackage這個(gè)父項(xiàng)目進(jìn)行install
依次對(duì)dao和service執(zhí)行了install后,可以在本地maven倉庫中找到它們:
然后對(duì)web模塊進(jìn)行打包,打包完成后,會(huì)在它的target文件夾下生成jar文件,我們運(yùn)行這上jar文件
java -jar web-0.0.1-SNAPSHOT.jar
然后這個(gè)項(xiàng)目就可以上線了。
8.2多人協(xié)作時(shí)
我們使用壓縮包的方式打開上邊這個(gè)打包好的jar包,可以在里邊找到剛才的service和dao打包成的jar包
也就是說,在對(duì)we模塊打包時(shí),是將本地倉庫中的maven倉庫中的service和dao的jar包打包了進(jìn)去,如果是多人協(xié)作的話,最好創(chuàng)建一個(gè)maven私服,這樣就會(huì)更加方便
- 總結(jié):
- 1.在實(shí)際工作中,肯定不止一個(gè)web,service,dao。請(qǐng)?jiān)诿麜r(shí)做到見名知義。
- 2.除了web層,其他的子模塊最終會(huì)被打包成jar包,放在web包中,只需要運(yùn)行這一個(gè)jar包就可以了
- 3.父工程的打包方式一定要是pom,即
<packaging>pom</packaging>
本文由博客一文多發(fā)平臺(tái) OpenWrite 發(fā)布!