春季启动罐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:runmvn 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:runmvn spring-boot:repackage 的区别在于spring-boot:run 用于本地运行和调试,而spring-boot:repackage 用于打包部署。

另外,您需要指定&lt;packaging&gt;jar&lt;/packaging&gt;

App.java 的另一个注释,您可以只使用一个注释作为@SpringBootApplication。假设App.java 在包myProject.status 中,它将涵盖所有三个注释。

【讨论】:

感谢您的建议,但没有帮助,仍然是同样的错误。我什至将 jar 模式添加到 spring-boot-maven-plugin 配置中。我得到同一个罐子。看起来从 jar 运行不会扫描自动装配。这不是我的第一个 Spring Boot 项目,它以前也有效。但不是现在。 另外一个项目被Springbootapplication注解了,可能是重点。在这里,我配置了几个数据源,它们不适用于我的自动配置。所以我手动注释了它。我试图找出这个注释和从 jar 运行的方式之间可能存在的区别。 @Slava,如果您可以将代码推送到某个地方,我们可以从那里进行调试。 感谢您的宝贵时间和帮助!删除 (basePackages = "myProject.status" ) 使 jar 运行

以上是关于春季启动罐NoSuchBeanDefinitionException的主要内容,如果未能解决你的问题,请参考以下文章

IndexOutOfBoundsException 春季批处理和春季启动

春季启动批处理到具有多个作业的春季云任务

春季启动 DispatcherServlet

春季启动 JSON 响应

春季启动MongoDB配置

春季启动启动器graphql不工作