maven依賴導入失敗
1. 首先,一般安裝好maven后,網上都會有教程將maven鏡像站換為aliyun的鏡像站,具體是在setting.xml文件的mirrors節點中添加如下配置:
<mirror> <id>nexus-aliyun</id> <mirrorOf>*</mirrorOf> <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror>
2. 有的時候,依賴雖然下載失敗了,但是相關文件夾中卻多了以 .lastUpdated為后綴的文件,此時,如果開發者在開發工具中反復導入,會發現始終無法導入成功,這個時候就需要刪除本地倉庫中相關的 .lastUpdated文件,可以通過文件搜索找到本地倉庫中所有的以 .lastUpdated為后綴的文件,找到后全部刪除,再在開發工具中重新導入依賴。
maven install 和 maven package 的區別
在idea項目的maven窗口中可以快速執行命令
他們的具體區別也很簡單:
如果service項目依賴dao項目,而dao打了包(package),jar僅僅時打到了dao項目的target下。
這時編譯service項目,還是會報錯,報錯如下,找不到所依賴的dao項目,說明service項目在本地倉庫是沒有找到它所依賴的dao項目。
然后把dao項目install,本地倉庫里有jar了,然后再打包package這個service項目,就不報錯了。
idea編譯的時候報錯 java: 找不到符號
假設有兩個微服務模塊,分別叫A和B,A是你需要發布的項目,但是A里面引入了B。所以在A的項目資源中可以看到B.jar。當在B中新增了一些方法或者屬性供A直接調用的時候,在本地測試或許好使。但是打包的時候會報錯 java:找不到符號。而這個錯誤指向你那個新增的方法或屬性。這是因為打包的時候,A引入的B.jar還是本地倉庫里那個之前的B.jar,所以把B重新install一下,更新本地的B.jar到最新版。之后再打包。問題就消失了。
模塊間的方法調用問題
例如module1模塊要調用module2模塊中的工具類。那么就在module1的pom文件中,引入module2即可。
- module1的pom.xml
<dependency> <groupId> module2 的 groupId </groupId> <artifactId> module2 的 artifactId </artifactId> <version> module2 的 version </version> </dependency>
- module2的pom.xml
<groupId> module2 的 groupId </groupId> <artifactId> module2 的 artifactId </artifactId> <version> module2 的 version </version> <name>module2</name>
查看某個類屬於哪個依賴
我用的開發工具是Idea,由於原項目中所有類已經引入好了,所以直接按住Ctrl鍵鼠標左鍵單擊就會跳轉到class中,然后再定位到這個class。
如圖所示,引入一個依賴需要的信息都展示出來了。下面就是在需要該依賴的模塊的 pom 文件中直接引入就可以了。
通過 feign 遠程調用三方項目的接口
下圖是微服務A的接口
我在另一個微服務B中想要調用這個接口:
前提:這兩個項目都在注冊中心之中已經相關的Feign依賴已經引入並配置完畢,在啟動類上加@EnableFeignClients注解
1. 首先在B中聲明一個接口,並添加注解@FeignClient,value值指向微服務A在注冊中心中的服務名。requestMapping的請求類型和路徑要和微服務A中的接口定義的一樣。
2.在需要調用的類中注入,並直接調用其方法即可使用。
springboot多模塊包掃描問題
SpringBoot 啟動類上,配置掃描包路徑有三種方式:
@SpringBootApplication(scanBasePackages ={"a","b"}) @ComponentScan(basePackages = {"a","b","c"}) @MapperScan({"XXX"}) public class XXApplication extends SpringBootServletInitializer{ }
SpringBootApplication注解
這是 SpringBoot 的注解,本質是三個 Spring 注解的和:
- @Configuration
- @EnableAutoConfiguration
- @ComponentScan
它默認掃描啟動類所在包及其所有子包, 但是不包括第三方的 jar 包的其他目錄 ,通過 scanBasePackages 屬性可以重新設置掃描包路徑。
注意:如果我們需要掃描依賴 jar 包中的注解,而依賴包的路徑跟不包含在 SpringBoot 啟動類路徑中的話,我們就要單獨使用 @ComponentScan 注解掃描第三方包。同時必須指定本工程的掃描路徑, 因為一旦有這個注解后,它優先,默認掃描包就失效了 。
SpringBoot 啟動類的工程目錄為 cn.com.a.b ,引用的第三方公共包 xxx.common.jar 的目錄也是 cn.com.a.b ,那么第三方 jar 包中的注解天然能直接被掃描到。
ComponentScan注解
這個是 Spring 框架的注解,它用來指定組件掃描路徑,如果用這個注解,它的值必須包含整個工程中全部需要掃描的路徑。因為它會覆蓋 SpringBootApplication 的默認掃描路徑,導致其失效。
如果 ComponentScan 指定多個具體子目錄,此時 SpringBootApplication 會失效,Spring 只會掃描 ComponentScan 指定目錄下的注解。如果恰好有目錄外的 Controller 類,很遺憾,這些控制器將無法訪問。
回到開頭那段代碼:
@SpringBootApplication(scanBasePackages ={})
@ComponentScan(basePackages = {})
這里指定了 ComponentScan 注解后, scanBasePackages 就失效了。因此,如果 ComponentScan 的 basePackages 值不包括 cn.com.a.b 即啟動類所在的包,僅指定了第三方 jar 的目錄,那么 這個工程下任何的注解都無法被掃描到 。
所以,如果加了ComponentScan注解之后,如果SpringBoot 啟動類的工程目錄為 com.qm.business.admin,需要額外掃描的jar包的路徑為com.qm.business.logmanager,那么完整的注解應該為:
@ComponentScan(basePackages ={"com.qm.business.admin", "com.qm.business.logmanager"})
MapperScan 注解
這個是 MyBatis 的注解,會將指定目錄下所有 DAO 類封裝成 MyBatis 的 BaseMapper 類,然后注入 Spring 容器中, 不需要額外的注解 ,就可以完成注入。
springboot聚合工程引用其他模塊jar包打包時報:程序包xxx不存在解決辦法
springboot聚合工程要打包工程引用其他模塊的jar包打包時報程序包找不到,原因是springboot工程打包編譯時,會生成兩種jar包,一種是普通的jar包,另一種時可執行jar包,默認情況下兩個jar的名稱相同,因此在不做額外配置的情況下,普通的jar先生成,可執行jar后生成,這種情況下可執行jar會覆蓋普通jar,而我們要引用的就是普通jar,所以打包時會報錯。
修改引用的jar包模塊的pom文件中的bulid配置,原配置:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
修改后的配置:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <classifier>exec</classifier> </configuration> </plugin> </plugins> </build>