javascript
springboot导入项目依赖报错_最详细的 Spring Boot 多模块开发与排坑指南
來源于公眾未讀代碼 ,
作者達西呀
創(chuàng)建項目
創(chuàng)建一個 SpringBoot 項目非常的簡單,簡單到這里根本不用再提。你可以在使用 IDEA 新建項目時直接選擇 Spring Initlalize 創(chuàng)建一個 Spring Boot 項目,也可以使用 Spring 官方提供的 Spring Boot 項目生成頁面得到一個項目。
下面介紹一下使用 Spring 官方生成的方式,如果你已經(jīng)有了一個 Spring Boot 項目,這部分可以直接跳過。
到這里已經(jīng)得到了一個 Spring Boot 初始項目了,我們直接導(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 用于測試。
項目目錄結(jié)構(gòu)
ProductController 類源代碼。
@RestController@RequestMapping("/product")publicclass ProductController { /** * 獲取商品列表 * * @return */ @GetMapping("/list") public Map list() { // 模擬查詢商品邏輯 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 類源代碼。
@Datapublicclass Product { /** 商品名稱. */ private String productName; /** 商品價格. */ private BigDecimal productPrice; /** 商品庫存。*/ privateint productStock;}模塊化
借助 IDEA 工具可以快速的把項目改造成 maven 多模塊,這里我們把準備測試 demo 拆分為 common 和 web 兩個模塊,common 模塊存放實體類。web 模塊存放 controller 層(這里項目雖小,拆分只是為了演示)。話不多說,直接開始。
....
....
到這里,多模塊已經(jīng)拆分完成了, 但是 ProductController 代碼里的紅色警告讓你發(fā)現(xiàn)事情還沒有結(jié)束。
依賴管理
處理依賴問題
你發(fā)現(xiàn)了代碼里的紅色警告,不過你也瞬間想到了是因為把 Product 類移動到了 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機智的在 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滿心歡喜的你快速的點擊 Build-> Build Project,得到的 Error 警告刺痛了頂著黑眼圈的你。
不過你還是迅速定位了問題,查看 maven 依賴,你發(fā)現(xiàn)是因為沒有指定 product-common 依賴的版本號。
報錯信息
原來如此,因為沒有指定版本號,我們指定上不就完事了嘛。在最外層的主 pom.xml 中添加 添加上指定依賴和要指定的版本號。
com.wdbyte product-common 0.0.1-SNAPSHOT刷新 maven ,發(fā)現(xiàn)項目已經(jīng)不報錯了,編譯成功,運行啟動類,熟悉的 Spring logo 又出現(xiàn)在眼前。
優(yōu)化依賴
是的,Spring Boot 應(yīng)用在改造成多模塊后成功運行了起來,但是你貌似發(fā)現(xiàn)一個問題,模塊 common 和模塊 web 都繼承了主 pom ,主 pom 中有 Lombok 、Spring Boot Web 和 Spring Boot Test 依賴,而 common 模塊里只用到了 Lombok 啊,卻一樣繼承了 Spring Boot 其他依賴,看來還是要改造一把。
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)一切正常,運行發(fā)現(xiàn)一切正常,訪問正常。
訪問接口
打包編譯
好了,終于到了最后一步了,你感覺到勝利的曙光已經(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 讓你傷心了,但是你還是從報錯中尋找到了一些蛛絲馬跡,你看到是 spring-boot-maven-plugin 報出的錯誤。重新審視你的主 pom 發(fā)現(xiàn) 編譯插件用到了 spring-boot-maven-plugin。
org.springframework.boot spring-boot-maven-plugin略加思索后將這段移動到 web 模塊的 pom,因為這是 Spring Boot 的打包方式,現(xiàn)在放在主 pom 中所有的模塊都會繼承到,那么對于 common 模塊來說是肯定不需要的。
移動后重新打包,不管你是運行命令 mvn package 還是雙擊 IDEA 中的 maven 管理中的 package ,想必這時候你都已經(jīng)打包成功了
IDEA 打包
在 web 模塊下的目錄 target 里也可以看到打包后的 jar 文件 product-web-0.0.1-SNAPSHOT.jar。可以使用 java 命令直接運行。
$ 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'想必少了點什么,多模塊不僅為了結(jié)構(gòu)清晰,更是為了其他項目可以復(fù)用模塊(如 common 模塊),現(xiàn)在這個時候如果你新打開了一個項目,依賴 common 發(fā)現(xiàn)是引用不到的,因為你需要把模塊安裝到本地倉庫。可以點擊 IDEA -> Maven -> install,也可以通過 maven 命令。
# -Dmaven.test.skip=true 跳過測試# -U 強制刷新# clean 清理緩存# install 安裝到本地倉庫$ springboot-module-demo> mvn -Dmaven.test.skip=true -U clean install重新引入發(fā)現(xiàn)沒有問題了。
文中代碼已經(jīng)上傳到 Github:niumoo/springboot
總結(jié)
以上是生活随笔為你收集整理的springboot导入项目依赖报错_最详细的 Spring Boot 多模块开发与排坑指南的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mybatis代码自动生成器_最近很火的
- 下一篇: html控制图的宽,用JointJS做一