溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

spring注解在自定義jar包中無法被掃描的問題如何解決

發(fā)布時間:2021-08-03 17:22:37 來源:億速云 閱讀:208 作者:chen 欄目:開發(fā)技術(shù)

這篇文章主要介紹“spring注解在自定義jar包中無法被掃描的問題如何解決”,在日常操作中,相信很多人在spring注解在自定義jar包中無法被掃描的問題如何解決問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”spring注解在自定義jar包中無法被掃描的問題如何解決”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

spring注解在自定義jar包中無法被掃描

前兩天,一朋友在開發(fā)的時候遇到了一個問題向我求助, service服務(wù)為第三方提供的服務(wù)里面有spring注解并將service 打成jar包中,使用maven引入。

使用new可以創(chuàng)建,但是使用autowire無法注入提示信息如下圖

spring注解在自定義jar包中無法被掃描的問題如何解決

報錯信息

這類問題在開發(fā)中一直是我們最不愿意看到的,乍一看,感覺挺對,還挺有道理。但是就是更想要的結(jié)果對不上。

我當(dāng)時給出的判斷autowire的類重名導(dǎo)致注入失敗,建議用配合使用qualifier或者 使用resource 但是發(fā)現(xiàn)不是這個錯誤。

于是我為了還原錯誤問題花了兩個小時終于找到了問題出現(xiàn)的原因,以及解決辦法。

首先出現(xiàn) spring注解在jar包中無法被掃描問題 的出現(xiàn)是 使用eclipse 導(dǎo)出jar包時 選擇Add directory entries

spring注解在自定義jar包中無法被掃描的問題如何解決

打jar包時應(yīng)選擇add directory entries

原因我來解釋一下

首先我最先找到解決辦法是 當(dāng)我們使用 @configuration 加上bean時可以正常注入 說明包已經(jīng)引入且可以加載到虛擬機(jī)中

spring注解在自定義jar包中無法被掃描的問題如何解決

使用配置文件注解加入jar包對象bean

而使用@autowire無法實現(xiàn)注入說明在 遍歷對應(yīng)類時在對應(yīng)的路徑下無法找到對應(yīng)的類

因為如果不選擇Add directory entries 這種默認(rèn)方式生成的jar包中,只含有class文件,而并沒有我們所知的文件夾目錄結(jié)構(gòu)??赡芪覀兇蠖鄶?shù)人認(rèn)為com.neusoft.service.HelloService類,HelloService類文件就應(yīng)該在service文件夾下的文件夾里,這其實是錯誤的看法

com.neusoft.service真正的含義是package包域名,跟文件夾目錄層次結(jié)構(gòu)是兩回事,我們只是習(xí)慣上用文件夾目錄來展示package而已。但package卻不一定非要用過文件夾目錄來展示。

我們可以用下面這段代碼來進(jìn)一步說明這個問題

將service打成jar包 不選擇Add directory entries

并使用maven命令將 jar包放入本地庫中

mvn install:install-file -Dfile=F:\temp\add\aaa.jar -DgroupId=aaa -DartifactId=noaaa-jar -Dversion=1.0 -Dpackaging=jar

spring注解在自定義jar包中無法被掃描的問題如何解決

no add diretory entries jar

使用java遍歷

@Test
    public void test() {
        // 項目中jar包所在物理路徑
                String jarName = "E:\\maven-repository\\aaa\\noaaa-jar\\1.0\\noaaa-jar-1.0.jar";
                JarFile jarFile;
                try {
                        jarFile = new JarFile(jarName);
                
                    Enumeration<JarEntry> entrys = jarFile.entries();
                    while (entrys.hasMoreElements()) {
                        JarEntry jarEntry = entrys.nextElement();
                        System.out.println(jarEntry.getName());
                    }       
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
   
    }

spring注解在自定義jar包中無法被掃描的問題如何解決

遍歷結(jié)果

將service打成jar包 選擇Add directory entries 添加到maven本地倉儲中

命令:

mvn install:install-file
  • -DgroupId=包名

  • -DartifactId=項目名

  • -Dversion=版本號

  • -Dpackaging=jar

  • -Dfile=jar文件所在路徑(我這里使用的是絕對路徑)

mvn install:install-file -Dfile=F:\temp\add\aaa.jar -DgroupId=aaa -DartifactId=aaa-jar -Dversion=1.0 -Dpackaging=jar

spring注解在自定義jar包中無法被掃描的問題如何解決

add diretory entries jar

使用java遍歷

@Test
    public void test() {
        // 項目中jar包所在物理路徑
                String jarName = "E:\\maven-repository\\aaa\\aaa-jar\\1.0\\aaa-jar-1.0.jar";
                JarFile jarFile;
                try {
                        jarFile = new JarFile(jarName);
                
                    Enumeration<JarEntry> entrys = jarFile.entries();
                    while (entrys.hasMoreElements()) {
                        JarEntry jarEntry = entrys.nextElement();
                        System.out.println(jarEntry.getName());
                    }       
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
   
    }

spring注解在自定義jar包中無法被掃描的問題如何解決

遍歷結(jié)果

META-INF/MANIFEST.MF

com/

com/neusoft/

com/neusoft/service/

com/neusoft/service/HelloService.class

發(fā)現(xiàn)加上Add directory entries 有目錄 而不加只有對應(yīng)class類。 這也就解釋了為什么無法加載spring的注解。

到此,關(guān)于“spring注解在自定義jar包中無法被掃描的問題如何解決”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI