spring注解在自定義jar包中無(wú)法被掃描的解決方案
spring注解在自定義jar包中無(wú)法被掃描
前兩天,一朋友在開(kāi)發(fā)的時(shí)候遇到了一個(gè)問(wèn)題向我求助, service服務(wù)為第三方提供的服務(wù)里面有spring注解并將service 打成jar包中,使用maven引入。
使用new可以創(chuàng)建,但是使用autowire無(wú)法注入提示信息如下圖

報(bào)錯(cuò)信息
這類(lèi)問(wèn)題在開(kāi)發(fā)中一直是我們最不愿意看到的,乍一看,感覺(jué)挺對(duì),還挺有道理。但是就是更想要的結(jié)果對(duì)不上。
我當(dāng)時(shí)給出的判斷autowire的類(lèi)重名導(dǎo)致注入失敗,建議用配合使用qualifier或者 使用resource 但是發(fā)現(xiàn)不是這個(gè)錯(cuò)誤。
于是我為了還原錯(cuò)誤問(wèn)題花了兩個(gè)小時(shí)終于找到了問(wèn)題出現(xiàn)的原因,以及解決辦法。
首先出現(xiàn) spring注解在jar包中無(wú)法被掃描問(wèn)題 的出現(xiàn)是 使用eclipse 導(dǎo)出jar包時(shí) 選擇Add directory entries

打jar包時(shí)應(yīng)選擇add directory entries
原因我來(lái)解釋一下
首先我最先找到解決辦法是 當(dāng)我們使用 @configuration 加上bean時(shí)可以正常注入 說(shuō)明包已經(jīng)引入且可以加載到虛擬機(jī)中

使用配置文件注解加入jar包對(duì)象bean
而使用@autowire無(wú)法實(shí)現(xiàn)注入說(shuō)明在 遍歷對(duì)應(yīng)類(lèi)時(shí)在對(duì)應(yīng)的路徑下無(wú)法找到對(duì)應(yīng)的類(lèi)
因?yàn)槿绻贿x擇Add directory entries 這種默認(rèn)方式生成的jar包中,只含有class文件,而并沒(méi)有我們所知的文件夾目錄結(jié)構(gòu)??赡芪覀兇蠖鄶?shù)人認(rèn)為com.neusoft.service.HelloService類(lèi),HelloService類(lèi)文件就應(yīng)該在service文件夾下的文件夾里,這其實(shí)是錯(cuò)誤的看法
com.neusoft.service真正的含義是package包域名,跟文件夾目錄層次結(jié)構(gòu)是兩回事,我們只是習(xí)慣上用文件夾目錄來(lái)展示package而已。但package卻不一定非要用過(guò)文件夾目錄來(lái)展示。
我們可以用下面這段代碼來(lái)進(jìn)一步說(shuō)明這個(gè)問(wèn)題
將service打成jar包 不選擇Add directory entries
并使用maven命令將 jar包放入本地庫(kù)中
mvn install:install-file -Dfile=F:\temp\add\aaa.jar -DgroupId=aaa -DartifactId=noaaa-jar -Dversion=1.0 -Dpackaging=jar

no add diretory entries jar
使用java遍歷
@Test
public void test() {
// 項(xiàng)目中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();
}
}

遍歷結(jié)果
將service打成jar包 選擇Add directory entries 添加到maven本地倉(cāng)儲(chǔ)中
命令:
mvn install:install-file
- -DgroupId=包名
- -DartifactId=項(xiàng)目名
- -Dversion=版本號(hào)
- -Dpackaging=jar
- -Dfile=jar文件所在路徑(我這里使用的是絕對(duì)路徑)
mvn install:install-file -Dfile=F:\temp\add\aaa.jar -DgroupId=aaa -DartifactId=aaa-jar -Dversion=1.0 -Dpackaging=jar

add diretory entries jar
使用java遍歷
@Test
public void test() {
// 項(xiàng)目中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();
}
}

遍歷結(jié)果
META-INF/MANIFEST.MF
com/
com/neusoft/
com/neusoft/service/
com/neusoft/service/HelloService.class
發(fā)現(xiàn)加上Add directory entries 有目錄 而不加只有對(duì)應(yīng)class類(lèi)。 這也就解釋了為什么無(wú)法加載spring的注解。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java List的sort()方法改寫(xiě)compare()實(shí)現(xiàn)升序,降序,倒序的案例
這篇文章主要介紹了Java List的sort()方法改寫(xiě)compare()實(shí)現(xiàn)升序,降序,倒序的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03
Java 泛型總結(jié)(一):基本用法與類(lèi)型擦除
本文主要介紹了Java泛型的使用以及類(lèi)型擦除相關(guān)的問(wèn)題。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-03-03
SpringBoot部署在tomcat容器中運(yùn)行的部署方法
這篇文章主要介紹了SpringBoot部署在tomcat容器中運(yùn)行的部署方法,需要的朋友可以參考下2018-10-10
調(diào)用java.lang.Runtime.exec的正確姿勢(shì)分享
這篇文章主要介紹了調(diào)用java.lang.Runtime.exec的正確姿勢(shì),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
Java游戲開(kāi)發(fā)拼圖游戲經(jīng)典版
這篇文章主要介紹了Java游戲開(kāi)發(fā)拼圖游戲經(jīng)典版,對(duì)這方面感興趣的同學(xué)可以跟著教程試下2021-01-01
Java并發(fā)編程示例(七):守護(hù)線程的創(chuàng)建和運(yùn)行
這篇文章主要介紹了Java并發(fā)編程示例(七):守護(hù)線程的創(chuàng)建和運(yùn)行,在本節(jié)示例中,我們將創(chuàng)建兩個(gè)線程,一個(gè)是普通線程,向隊(duì)列中寫(xiě)入事件,另外一個(gè)是守護(hù)線程,清除隊(duì)列中的事件,需要的朋友可以參考下2014-12-12
Springboot整合Flowable6.x導(dǎo)出bpmn20的步驟詳解
這篇文章主要介紹了Springboot整合Flowable6.x導(dǎo)出bpmn20,Flowable流程引擎可用于部署B(yǎng)PMN 2.0流程定義,可以十分靈活地加入你的應(yīng)用/服務(wù)/構(gòu)架,本文給出兩種從flowable導(dǎo)出流程定義bpmn20.xml的方式,需要的朋友可以參考下2023-04-04

