【问题标题】:spring boot jar NoSuchBeanDefinitionException春季启动罐NoSuchBeanDefinitionException
【发布时间】:2023-03-30 08:58:01
【问题描述】:

我构建了 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" }) 一起使用,包括它的包

标签: spring maven spring-boot jar executable-jar


【解决方案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 运行
    猜你喜欢
    • 2017-09-11
    • 2015-04-18
    • 2017-06-24
    • 2015-08-22
    • 2015-09-18
    • 2015-03-20
    • 2018-01-24
    • 2016-08-22
    • 2016-07-22
    相关资源
    最近更新 更多