春季启动罐NoSuchBeanDefinitionException
Posted
技术标签:
【中文标题】春季启动罐NoSuchBeanDefinitionException【英文标题】:spring boot jar NoSuchBeanDefinitionException 【发布时间】:2018-05-22 15:06:10 【问题描述】:我构建了 Spring Boot 应用程序,如果我用 mvn spring-boot:run
启动它,它运行良好,但尝试运行它 java -jar jarName.jar
会导致错误 Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'HomeService' available
这是我的 pom.xml 和 spring-boot-maven-plugin
,就像这里描述的 https://docs.spring.io/spring-boot/docs/current/reference/html/deployment-install.html 和这里 Spring-Boot Executable-Jar NoSuchBeanDefinitionException
<build>
<sourceDirectory>src/main/java</sourceDirectory>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<resource>
<directory>src/main/resources/$profileName</directory>
</resource>
</resources>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
<compilerArgument>-proc:none</compilerArgument>
</configuration>
</plugin>
<plugin>
<groupId>org.bsc.maven</groupId>
<artifactId>maven-processor-plugin</artifactId>
<version>2.2.4</version>
<executions>
<execution>
<id>process</id>
<goals>
<goal>process</goal>
</goals>
<phase>generate-sources</phase>
<configuration>
<!-- source output directory -->
<outputDirectory>target/metamodel</outputDirectory>
<!-- <processors> -->
<!-- <processor>org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor</processor> -->
<!-- </processors> -->
<overwrite>true</overwrite>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>1.5.8.RELEASE</version>
<configuration>
<executable>true</executable>
<profiles>
<profile>dev</profile>
<profile>live</profile>
</profiles>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>live</id>
<build>
<plugins>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<tasks>
<delete file="src/main/resources/application.properties" />
<copy file="src/main/resources/application-live.properties"
tofile="src/main/resources/application.properties" />
</tasks>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>dev</id>
<build>
<plugins>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<tasks>
<delete file="src/main/resources/application.properties" />
<copy file="src/main/resources/application-dev.properties"
tofile="src/main/resources/application.properties" />
</tasks>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
这里是应用类
@Configuration
@EnableAutoConfiguration
@ComponentScan (basePackages = "myProject.status" )
public class App
private static final Logger logger = LogManager.getLogger(App.class);
public static void main(String[] args) throws BeansException, IOException, InterruptedException
logger.info("APPLICATION STARTED");
ConfigurableApplicationContext context = SpringApplication.run(App.class, args);
logger.info(context.getBean(HomeService.class).home());
这里是家庭服务
package myProject.status.service;
@Service
public class HomeService
public String home()
return "application works";
我还尝试在 @PostConstruct
方法中获取一个 bean,其中一切和所有 Autowires 都应该准备好,它也不起作用。
mvn spring-boot:run
和 mvn package
有什么区别?我怎样才能构建正确的 jar?
谢谢!
【问题讨论】:
你应该只使用spring boot插件而不是使用Maven jar插件吗? @PaulNUK 即使我禁用所有配置文件并从 pom an spring-boot-maven-plugin 配置中删除该部分,我也会收到相同的错误 引导时是否扫描了您的服务类? 看起来好像没有,所以我得到一个错误,但是为什么呢?它与 spring-boot:run 和 @ComponentScan (basePackages = "myProject.status" ) 一起使用,包括它的包 docs.spring.io/spring-boot/docs/current/maven-plugin/usage.html 这是我遵循的文档 【参考方案1】:我解决了我的问题。这很令人困惑,所以我会试着弄清楚为什么会这样。要让 jar 运行,我应该删除 (basePackages = "myProject.status" )
@ComponentScan (basePackages = "myProject.status" )
与 mvn spring-boot:run
一起使用,但只有纯 @ComponentScan
可以在 jar 中使用。实际上它确实是我的根目录,所以我不需要它,但是问题是,为什么它不能从 jar 中打开。所有类都在这个根目录下,所以它应该在那里找到它,但它可能不会扫描从 jar 运行的任何依赖项。
谢谢大家回复我!
【讨论】:
【参考方案2】:您可以只使用$ mvn package spring-boot:repackage 来构建一个独立的可执行jar。
mvn spring-boot:run
和mvn spring-boot:repackage
的区别在于spring-boot:run
用于本地运行和调试,而spring-boot:repackage
用于打包部署。
另外,您需要指定<packaging>jar</packaging>
。
App.java
的另一个注释,您可以只使用一个注释作为@SpringBootApplication。假设App.java
在包myProject.status
中,它将涵盖所有三个注释。
【讨论】:
感谢您的建议,但没有帮助,仍然是同样的错误。我什至将 jar 模式添加到 spring-boot-maven-plugin 配置中。我得到同一个罐子。看起来从 jar 运行不会扫描自动装配。这不是我的第一个 Spring Boot 项目,它以前也有效。但不是现在。 另外一个项目被Springbootapplication注解了,可能是重点。在这里,我配置了几个数据源,它们不适用于我的自动配置。所以我手动注释了它。我试图找出这个注释和从 jar 运行的方式之间可能存在的区别。 @Slava,如果您可以将代码推送到某个地方,我们可以从那里进行调试。 感谢您的宝贵时间和帮助!删除 (basePackages = "myProject.status" ) 使 jar 运行以上是关于春季启动罐NoSuchBeanDefinitionException的主要内容,如果未能解决你的问题,请参考以下文章