【问题标题】:Spring Boot GS: ComponentScan and ClassNotFoundException for ConnectionFactorySpring Boot GS:ConnectionFactory 的 ComponentScan 和 ClassNotFoundException
【发布时间】:2015-03-28 11:05:58
【问题描述】:

我正在玩 Spring Boot 入门指南,但自动配置失败,我得到:

 java.lang.ClassNotFoundException: javax.jms.ConnectionFactory

这似乎是由于 Application 类的位置。它应该位于哪里?在顶级包(src/main/java)还是在特定包中?

【问题讨论】:

  • 你是否验证了所有的依赖关系?

标签: maven spring-boot


【解决方案1】:

不要将启动应用程序类放在默认包中。这样就可以解决问题了。

工作代码:

package com.spring.boot.app;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);         

    }
}

【讨论】:

    【解决方案2】:

    我遇到了同样的问题, 很快我意识到我没有在包中包含我的 MAIN 方法。 将 main 包含在包中后,spring boot 执行没有故障。

    示例程序(基本)-

    package springbootquickstart;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    
    public class application {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            SpringApplication.run(application.class, args);
    
        }
    
    }
    

    【讨论】:

    • 您可以通过在每行前添加四个空格来更好地格式化您的代码。
    • @ailnlv,谢谢,T-Heron 做到了,以后会记住这一点
    【解决方案3】:

    您需要将主类放在包中。因为 Spring Boot 注解 @SpringBootApplication 会在启动应用时寻找要扫描的包。

    所以请确保在您的主类文件之上有一个 package 语句。就是这样。

    【讨论】:

      【解决方案4】:

      你的配置应该是这样的,Application.java 应该是你包的根目录,例如 /src/main/java/io/eddumelendez

      io.eddumelendez 是我的包裹

      <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-parent</artifactId>
          <version>1.2.1.RELEASE</version>
          <relativePath />
        </parent>
        <groupId>io.eddumelendez.jms</groupId>
        <artifactId>spring-boot-jms-sample</artifactId>
        <version>1.0-SNAPSHOT</version>
        <packaging>jar</packaging>
      
        <name>qa</name>
        <url>http://maven.apache.org</url>
      
        <properties>
          <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        </properties>
      
        <dependencies>
          <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
          </dependency>
          <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jms</artifactId>
          </dependency>
          <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-broker</artifactId>
          </dependency>        
          <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
          </dependency>
          <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
          </dependency>
        </dependencies>
      
        <build>
          <plugins>
            <plugin>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
          </plugins>
        </build>
      
      </project>
      

      【讨论】:

        【解决方案5】:

        您的Application 类应放在特定包中,而不是默认(顶级)包中。例如,将其放在com.example 中,并将所有应用程序代码放在此包中或com.example.foocom.example.bar 等子包中。

        Application 类放在默认包中,即直接放在src/main/java 中并不是一个好主意,它几乎肯定会导致您的应用程序无法启动。如果这样做,您应该会看到以下警告:

        ** WARNING ** : Your ApplicationContext is unlikely to start due to a @ComponentScan of the default package.
        

        【讨论】:

        • 您的答案解决了问题,但很高兴知道为什么这对我来说“不是一个好主意”,Application 类在哪里并不重要。
        • 组件扫描会在您的主应用程序类所在的包及其所有子包中查找。如果将它放在默认包中,则会扫描类路径上的每个包。充其量,这将是浪费时间。在最坏的情况下,它会导致您的应用程序无法启动,因为它会找到它不应该找到的组件
        • 浪费时间和发现太多仍然比 [ClassNotFoundException] 更好,因为它似乎什么也没找到。更重要的是,我查看了 Spring 文档,说明了 Application 类的放置位置,它的字面意思是“我们建议您将主应用程序类定位在根包中”(docs.spring.io/spring-boot/docs/current/reference/html/…)。我错过了什么还是故意误导?
        • 当然不是故意误导。如果您阅读您链接到的文档的第 14.1 节,那应该很清楚
        猜你喜欢
        • 2014-04-21
        • 2014-11-17
        • 2018-08-18
        • 2018-06-14
        • 2017-07-25
        • 2017-08-01
        • 2021-03-10
        • 2018-08-15
        • 1970-01-01
        相关资源
        最近更新 更多