微服務項目常見問題


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>  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM