我有一个Spring Boot项目,我无法从外部jar 中获得要自动接线的组件。当我尝试这样做时,我得到org.springframework.beans.factory.NoSuchBeanDefinitionException
的提示,说找不到具有该名称的bean。
我尝试了类似问题中的一些解决方案,例如:
How to autowire @service from external Jar in Spring
Spring Boot @autowired does not work, classes in different package
How can I @Autowire a spring bean that was created from an external jar?
..但是仍然无法管理它。
这是我要完成的工作的一个示例:
这是Spring Boot项目 spring-project-example
中的启动类package com.springdi.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import com.dependency.example.DependencyBasePackageClass;
import com.dependency.example.somepackage.SomeBean;
@SpringBootApplication
@ComponentScan(basePackages = {"com.springdi.example"}, basePackageClasses = DependencyBasePackageClass.class)
public class SpringProjectExampleApplication {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(SpringProjectExampleApplication.class, args);
String beanName = SomeBean.class.getName();
System.out.printf("%s can be autowired: %s\n", beanName, String.valueOf(context.containsBean(beanName)).toUpperCase());
}
}
这只是一个简单的Spring Boot项目,用于检查是否可以自动连接依赖项jar中存在的组件。
这是 jar (dependency-example-1.0.0.jar)中的组件
package com.dependency.example.somepackage;
import org.springframework.stereotype.Component;
@Component
public class SomeBean {
public void someMethod() {
System.out.println("Some process...");
}
}
这是同一 jar
的基本包类package com.dependency.example;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
/**
* Just a class to serve as the root for component
* scanning in "com.dependency.example" and its sub-packages
*/
@Configuration
@ComponentScan
public class DependencyBasePackageClass {
}
我已经在SpringProjectExampleApplication中尝试过@Import(DependencyBasePackageClass.class)
,并在@ComponentScan
和basePackages
中尝试过basePackageClasses
,但是没有成功。
我也尝试使用@SpringBootApplication(scanBasePackageClasses = {SpringProjectExampleApplication.class, DependencyBasePackageClass.class})
和非安全类型@SpringBootApplication(scanBasePackages = {"com.springdi.example", "com.dependency.example"})
。
@Configuration @ComponentScan({"com.dependency.example"})
也失败,context.containsBean("com.dependency.example.somepackage.SomeBean")
仍返回 false 。
此jar作为依赖项包含在classpath和pom.xml中
<dependencies>
<!-- other dependencies -->
<dependency>
<groupId>com.rbaggio</groupId>
<artifactId>dependency-example</artifactId>
<version>1.0.0</version>
<scope>system</scope>
<systemPath>${basedir}/lib/dependency-example-1.0.0.jar</systemPath>
</dependency>
</dependencies>
可能是罐子的位置,包含罐子的方式还是需要一些额外的配置?
我将不胜感激!预先感谢。
答案 0 :(得分:2)
了解一些基本知识,您已经混淆了一些软件包。
@SpringBootApplication
将扫描该注释所在的类下面的包中的所有类。此注释是@EnableAutoConfiguration
,@Configuration
和@ComponentScan
的别名,表示@ComponentScan(basePackages = {"com.springdi.example"}, basePackageClasses = DependencyBasePackageClass.class)
不需要。
com.springdi.example // class with @SpringBootApplication annotation
|
|
|
com.springdi.example.* // Will find all @Service, @Component, @Configuration
// in subpackages below the @SpringBootApplication
// annotation
上了解有关注释的更多信息
由于其他带有注释的类与@SpringBootApplication
处于相同的包结构中,因此需要定义所有要扫描的注释位置。
@SpringBootApplication(scanBasePackages = {"com.springdi.example", "com.dependency.example"})
可能会包括您要扫描的所有软件包。