javascript
springboot导入项目依赖报错_最详细的 Spring Boot 多模块开发与排坑指南
來(lái)源于公眾未讀代碼 ,
作者達(dá)西呀
創(chuàng)建項(xiàng)目
創(chuàng)建一個(gè) SpringBoot 項(xiàng)目非常的簡(jiǎn)單,簡(jiǎn)單到這里根本不用再提。你可以在使用 IDEA 新建項(xiàng)目時(shí)直接選擇 Spring Initlalize 創(chuàng)建一個(gè) Spring Boot 項(xiàng)目,也可以使用 Spring 官方提供的 Spring Boot 項(xiàng)目生成頁(yè)面得到一個(gè)項(xiàng)目。
下面介紹一下使用 Spring 官方生成的方式,如果你已經(jīng)有了一個(gè) Spring Boot 項(xiàng)目,這部分可以直接跳過(guò)。
到這里已經(jīng)得到了一個(gè) Spring Boot 初始項(xiàng)目了,我們直接導(dǎo)入到 IDEA 中,看一眼 pom.xml 的內(nèi)容。
<?xml version="1.0" encoding="UTF-8"?>4.0.0org.springframework.bootspring-boot-starter-parent2.2.5.RELEASEcom.wdbytespringboot-module-demo0.0.1-SNAPSHOTspringboot-module-demoDemo project for Spring Boot1.8org.springframework.bootspring-boot-starter-weborg.projectlomboklomboktrueorg.springframework.bootspring-boot-starter-testtestorg.junit.vintagejunit-vintage-engineorg.springframework.bootspring-boot-maven-plugin把目錄結(jié)構(gòu)調(diào)整成自己想要的結(jié)構(gòu),然后添加 controller 和 entity 用于測(cè)試。
項(xiàng)目目錄結(jié)構(gòu)
ProductController 類(lèi)源代碼。
@RestController@RequestMapping("/product")publicclass ProductController { /** * 獲取商品列表 * * @return */ @GetMapping("/list") public Map list() { // 模擬查詢(xún)商品邏輯 Product product = new Product(); product.setProductName("小米粥"); product.setProductPrice(new BigDecimal(2.0)); product.setProductStock(100); Map resultMap = new HashMap<>(); resultMap.put("code", 000); resultMap.put("message", "成功"); resultMap.put("data", Arrays.asList(product)); return resultMap; }}Product 類(lèi)源代碼。
@Datapublicclass Product { /** 商品名稱(chēng). */ private String productName; /** 商品價(jià)格. */ private BigDecimal productPrice; /** 商品庫(kù)存。*/ privateint productStock;}模塊化
借助 IDEA 工具可以快速的把項(xiàng)目改造成 maven 多模塊,這里我們把準(zhǔn)備測(cè)試 demo 拆分為 common 和 web 兩個(gè)模塊,common 模塊存放實(shí)體類(lèi)。web 模塊存放 controller 層(這里項(xiàng)目雖小,拆分只是為了演示)。話(huà)不多說(shuō),直接開(kāi)始。
....
....
到這里,多模塊已經(jīng)拆分完成了, 但是 ProductController 代碼里的紅色警告讓你發(fā)現(xiàn)事情還沒(méi)有結(jié)束。
依賴(lài)管理
處理依賴(lài)問(wèn)題
你發(fā)現(xiàn)了代碼里的紅色警告,不過(guò)你也瞬間想到了是因?yàn)榘?Product 類(lèi)移動(dòng)到了 product-common 模塊,導(dǎo)致這里引用不到了。
紅色警告
然后你查看了下 product-common 模塊的 pom.xml 里的內(nèi)容。
<?xml version="1.0" encoding="UTF-8"?> springboot-module-demo com.wdbyte0.0.1-SNAPSHOT4.0.0 product-common機(jī)智的在 Product-web 模塊的 pom.xml 里引入 product-common,手起鍵落,輕松搞定。
<?xml version="1.0" encoding="UTF-8"?> springboot-module-demo com.wdbyte0.0.1-SNAPSHOT4.0.0 product-web com.wdbyte product-common滿(mǎn)心歡喜的你快速的點(diǎn)擊 Build-> Build Project,得到的 Error 警告刺痛了頂著黑眼圈的你。
不過(guò)你還是迅速定位了問(wèn)題,查看 maven 依賴(lài),你發(fā)現(xiàn)是因?yàn)闆](méi)有指定 product-common 依賴(lài)的版本號(hào)。
報(bào)錯(cuò)信息
原來(lái)如此,因?yàn)闆](méi)有指定版本號(hào),我們指定上不就完事了嘛。在最外層的主 pom.xml 中添加 添加上指定依賴(lài)和要指定的版本號(hào)。
com.wdbyte product-common 0.0.1-SNAPSHOT刷新 maven ,發(fā)現(xiàn)項(xiàng)目已經(jīng)不報(bào)錯(cuò)了,編譯成功,運(yùn)行啟動(dòng)類(lèi),熟悉的 Spring logo 又出現(xiàn)在眼前。
優(yōu)化依賴(lài)
是的,Spring Boot 應(yīng)用在改造成多模塊后成功運(yùn)行了起來(lái),但是你貌似發(fā)現(xiàn)一個(gè)問(wèn)題,模塊 common 和模塊 web 都繼承了主 pom ,主 pom 中有 Lombok 、Spring Boot Web 和 Spring Boot Test 依賴(lài),而 common 模塊里只用到了 Lombok 啊,卻一樣繼承了 Spring Boot 其他依賴(lài),看來(lái)還是要改造一把。
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
springboot-module-democom.wdbyte0.0.1-SNAPSHOT4.0.0
product-commonorg.projectlombok
lomboktrue
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
springboot-module-democom.wdbyte0.0.1-SNAPSHOT4.0.0
product-webcom.wdbyte
product-commonorg.springframework.boot
spring-boot-starter-weborg.springframework.boot
spring-boot-starter-testtestorg.junit.vintage
junit-vintage-engine
spring-boot-starter-parent2.2.5.RELEASEcom.wdbyte
springboot-module-demo0.0.1-SNAPSHOTspringboot-module-demoDemo project for Spring Boot1.80.0.1-SNAPSHOTcom.wdbyte
product-common${product-common.version}org.springframework.boot
spring-boot-maven-plugin
看似完美,重新 Build-> Build Project ,發(fā)現(xiàn)一切正常,運(yùn)行發(fā)現(xiàn)一切正常,訪問(wèn)正常。
訪問(wèn)接口
打包編譯
好了,終于到了最后一步了,你感覺(jué)到勝利的曙光已經(jīng)照到了頭頂,反射出耀眼的光芒。接著就是 mvn package。
[INFO] springboot-module-demo ............................. SUCCESS [ 2.653 s][INFO] product-common ..................................... FAILURE [ 2.718 s][INFO] product-web ........................................ SKIPPED[INFO] ------------------------------------------------------------------------[INFO] BUILD FAILURE[INFO] ------------------------------------------------------------------------[INFO] Total time: 6.084 s[INFO] Finished at: 2020-03-19T08:15:52+08:00[INFO] Final Memory: 22M/87M[INFO] ------------------------------------------------------------------------[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.2.5.RELEASE:repackage (repackage) on project product-common: Execution repackage of goal org.springframework.boot:spring-boot-maven-plugin:2.2.5.RELEASE:repackage failed: Unable to find main class -> [Help 1][ERROR]ERROR 讓你傷心了,但是你還是從報(bào)錯(cuò)中尋找到了一些蛛絲馬跡,你看到是 spring-boot-maven-plugin 報(bào)出的錯(cuò)誤。重新審視你的主 pom 發(fā)現(xiàn) 編譯插件用到了 spring-boot-maven-plugin。
org.springframework.boot spring-boot-maven-plugin略加思索后將這段移動(dòng)到 web 模塊的 pom,因?yàn)檫@是 Spring Boot 的打包方式,現(xiàn)在放在主 pom 中所有的模塊都會(huì)繼承到,那么對(duì)于 common 模塊來(lái)說(shuō)是肯定不需要的。
移動(dòng)后重新打包,不管你是運(yùn)行命令 mvn package 還是雙擊 IDEA 中的 maven 管理中的 package ,想必這時(shí)候你都已經(jīng)打包成功了
IDEA 打包
在 web 模塊下的目錄 target 里也可以看到打包后的 jar 文件 product-web-0.0.1-SNAPSHOT.jar。可以使用 java 命令直接運(yùn)行。
$ springboot-module-demoproduct-webarget>java -jar product-web-0.0.1-SNAPSHOT.jar . ____ _ __ _ _ / / ___'_ __ _ _(_)_ __ __ _ ( ( )___ | '_ | '_| | '_ / _` | / ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |___, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.2.5.RELEASE)2020-03-19 08:33:03.337 INFO 15324 --- [ main] com.wdbyte.Application : Starting Application v0.0.1-SNAPSHOT on DESKTOP-8SCFV4M with PID 15324 (C:甥敳獲83981Desktopspringboot-module-demoproduct-webargetproduct-web-0.0.1-SNAPSHOT.jar started by 83981 in C:甥敳獲83981Desktopspringboot-module-demoproduct-webarget)2020-03-19 08:33:03.340 INFO 15324 --- [ main] com.wdbyte.Application : No active profile set, falling back to default profiles: default2020-03-19 08:33:04.410 INFO 15324 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)2020-03-19 08:33:04.432 INFO 15324 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]2020-03-19 08:33:04.432 INFO 15324 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.31]2020-03-19 08:33:04.493 INFO 15324 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext2020-03-19 08:33:04.493 INFO 15324 --- [ main] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1107 ms2020-03-19 08:33:04.636 INFO 15324 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'2020-03-19 08:33:04.769 INFO 15324 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''2020-03-19 08:33:04.772 INFO 15324 --- [ main] com.wdbyte.Application : Started Application in 1.924 seconds (JVM running for 2.649)2020-03-19 08:33:07.087 INFO 15324 --- [extShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor'想必少了點(diǎn)什么,多模塊不僅為了結(jié)構(gòu)清晰,更是為了其他項(xiàng)目可以復(fù)用模塊(如 common 模塊),現(xiàn)在這個(gè)時(shí)候如果你新打開(kāi)了一個(gè)項(xiàng)目,依賴(lài) common 發(fā)現(xiàn)是引用不到的,因?yàn)槟阈枰涯K安裝到本地倉(cāng)庫(kù)。可以點(diǎn)擊 IDEA -> Maven -> install,也可以通過(guò) maven 命令。
# -Dmaven.test.skip=true 跳過(guò)測(cè)試# -U 強(qiáng)制刷新# clean 清理緩存# install 安裝到本地倉(cāng)庫(kù)$ springboot-module-demo> mvn -Dmaven.test.skip=true -U clean install重新引入發(fā)現(xiàn)沒(méi)有問(wèn)題了。
文中代碼已經(jīng)上傳到 Github:niumoo/springboot
總結(jié)
以上是生活随笔為你收集整理的springboot导入项目依赖报错_最详细的 Spring Boot 多模块开发与排坑指南的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mybatis代码自动生成器_最近很火的
- 下一篇: 模板引擎工作原理_广州seo了解下搜索引