spring注解在⾃定义jar包中⽆法被扫描的解决⽅案spring注解在⾃定义jar包中⽆法被扫描
前两天,⼀朋友在开发的时候遇到了⼀个问题向我求助, service服务为第三⽅提供的服务⾥⾯有spring注解并将service 打成jar包中,使⽤maven引⼊。
使⽤new可以创建,但是使⽤autowire⽆法注⼊提⽰信息如下图
报错信息
这类问题在开发中⼀直是我们最不愿意看到的,乍⼀看,感觉挺对,还挺有道理。但是就是更想要的结果对不上。
我当时给出的判断autowire的类重名导致注⼊失败,建议⽤配合使⽤qualifier或者使⽤resource 但是发现不是这个错误。
于是我为了还原错误问题花了两个⼩时终于到了问题出现的原因,以及解决办法。
⾸先出现 spring注解在jar包中⽆法被扫描问题的出现是使⽤eclipse 导出jar包时选择Add directory entries
spring怎么读取jar文件打jar包时应选择add directory entries
原因我来解释⼀下
⾸先我最先到解决办法是当我们使⽤ @configuration 加上bean时可以正常注⼊说明包已经引⼊且可以加载到虚拟机中
使⽤配置⽂件注解加⼊jar包对象bean
⽽使⽤@autowire⽆法实现注⼊说明在遍历对应类时在对应的路径下⽆法到对应的类
因为如果不选择Add directory entries 这种默认⽅式⽣成的jar包中,只含有class⽂件,⽽并没有我们所知的⽂件夹⽬录结构。可能我们⼤多数⼈认为usoft.service.HelloService类,HelloService类⽂件就应该在service⽂件夹下的⽂件夹⾥,这其实是错误的看法
我们可以⽤下⾯这段代码来进⼀步说明这个问题
将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
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 = ies();
while (entrys.hasMoreElements()) {
JarEntry jarEntry = Element();
System.out.Name());
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
遍历结果
将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
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 = ies();
while (entrys.hasMoreElements()) {
JarEntry jarEntry = Element();
System.out.Name());
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
遍历结果
META-INF/MANIFEST.MF
com/
com/neusoft/
com/neusoft/service/
com/neusoft/service/HelloService.class
发现加上Add directory entries 有⽬录⽽不加只有对应class类。这也就解释了为什么⽆法加载spring的注解。以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。