【问题标题】:Spring boot non-fatal errors ClassNotFoundExceptionSpring boot 非致命错误 ClassNotFoundException
【发布时间】:2015-05-08 23:15:50
【问题描述】:

我正在尝试创建 Spring Boot 应用程序以与 Apache ActiveMQ 协作。

在启动期间,我收到以下“非致命”错误:

java.lang.ClassNotFoundException: org.springframework.data.web.config.EnableSpringDataWebSupport
    at java.net.URLClassLoader$1.run(Unknown Source) ~[na:1.8.0_25]
    at java.net.URLClassLoader$1.run(Unknown Source) ~[na:1.8.0_25]
    at java.security.AccessController.doPrivileged(Native Method) ~[na:1.8.0_25]
    at java.net.URLClassLoader.findClass(Unknown Source) ~[na:1.8.0_25]
    at java.lang.ClassLoader.loadClass(Unknown Source) ~[na:1.8.0_25]
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) ~[na:1.8.0_25]
    at java.lang.ClassLoader.loadClass(Unknown Source) ~[na:1.8.0_25]

java.lang.ClassNotFoundException: org.springframework.security.config.annotation.web.configuration.EnableWebSecurity
    at java.net.URLClassLoader$1.run(Unknown Source) ~[na:1.8.0_25]
    at java.net.URLClassLoader$1.run(Unknown Source) ~[na:1.8.0_25]
    at java.security.AccessController.doPrivileged(Native Method) ~[na:1.8.0_25]
    at java.net.URLClassLoader.findClass(Unknown Source) ~[na:1.8.0_25]
    at java.lang.ClassLoader.loadClass(Unknown Source) ~[na:1.8.0_25]
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) ~[na:1.8.0_25]
    at java.lang.ClassLoader.loadClass(Unknown Source) ~[na:1.8.0_25]

这是我的文件:

@Configuration
@EnableJms
public class ActiveMQTestConfig {

    @Bean
    // Strictly speaking this bean is not necessary as boot creates a default
    JmsListenerContainerFactory<?> myJmsContainerFactory(ConnectionFactory connectionFactory) {
        SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory);
        return factory;
    }

}

@Configuration
@ComponentScan("com.example.messages")
@SpringBootApplication
public class TestConfig {    
}

@Component
public class Receiver {

    /**
     * Get a copy of the application context
     */
    @Autowired
    ConfigurableApplicationContext context;

    /**
     * When you receive a message, print it out, then shut down the application.
     * Finally, clean up any ActiveMQ server stuff.
     */
    @JmsListener(destination = "mailbox-destination", containerFactory = "myJmsContainerFactory")
    public void receiveMessage(String message) {
        System.out.println("Received <" + message + ">");
        context.close();
        FileSystemUtils.deleteRecursively(new File("activemq-data"));
    }

}

@SpringApplicationConfiguration(classes = { TestConfig.class, ActiveMQTestConfig.class })
@RunWith(SpringJUnit4ClassRunner.class)
public class ReceiverTest {

    @Autowired
    private JmsTemplate jmsTemplate;

    @Test
    public void testReceiver() {
        // Clean out any ActiveMQ data from a previous run
        FileSystemUtils.deleteRecursively(new File("activemq-data"));

        // Send a message
        MessageCreator messageCreator = new MessageCreator() {
            @Override
            public Message createMessage(Session session) throws JMSException {
                return session.createTextMessage("ping!");
            }
        };

        System.out.println("Sending a new message.");
        jmsTemplate.send("mailbox-destination", messageCreator);

    }

}

日志配置 - logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>
                %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
            </Pattern>
        </layout>
    </appender>

    <logger name="org.springframework" level="debug" additivity="false">
        <appender-ref ref="STDOUT" />
    </logger>

    <root level="error">
        <appender-ref ref="STDOUT" />
    </root>

</configuration>

来自 parent-pom 的依赖配置:

<!-- jUnit -->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>${junit.version}</version>
    <scope>test</scope>
</dependency>

<!-- Aspectj -->
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjrt</artifactId>
    <version>${aspectj.version}</version>
</dependency>
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>${aspectj.version}</version>
</dependency>
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjtools</artifactId>
    <version>${aspectj.version}</version>
</dependency>

<!-- Spring -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-expression</artifactId>
    <version>${spring.version}</version>
</dependency>

<!-- Spring boot -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot</artifactId>
    <version>${spring.boot.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-autoconfigure</artifactId>
    <version>${spring.boot.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-logging</artifactId>
    <version>${spring.boot.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <version>${spring.boot.version}</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>javax.enterprise</groupId>
    <artifactId>cdi-api</artifactId>
    <version>${cdi-api.version}</version>
</dependency>

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>${commons-lang3.version}</version>
</dependency>
<dependency>
    <groupId>commons-validator</groupId>
    <artifactId>commons-validator</artifactId>
    <version>${commons-validator.version}</version>
</dependency>
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>${commons-io.version}</version>
</dependency>

<!-- Logging -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>${slf4j.version}</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>${logback.version}</version>
</dependency>

此项目的依赖配置:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jms</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.activemq</groupId>
    <artifactId>activemq-broker</artifactId>
    <version>${activemq.version}</version>
</dependency>

如何防止 Spring Boot 寻找未使用的类和注解?在这个项目中我不需要任何与网络相关的东西。

【问题讨论】:

  • 这些错误从何而来?您是如何配置日志记录的?
  • 在问题正文中添加了日志记录配置
  • 你觉得这对level="debug"有什么作用?
  • 2015-03-07 13:34:42 [main] 调试 o.s.c.t.c.AnnotationAttributesReadingVisitor - 读取注释元数据时无法加载类型。这是一个非致命错误,但某些注释元数据可能不可用。 java.lang.ClassNotFoundException: org.springframework.security.config.annotation.web.configuration.EnableWebSecurity
  • Spring Boot 需要检测类路径上的内容,以便检查某些类是否存在。如果它们是,则添加配置,如果不是,您会收到一条调试消息。这是 Spring Boot 检测类路径上的内容的唯一方法。要禁用这些消息,请不要在调试时记录所有内容。

标签: spring activemq spring-boot


【解决方案1】:

Spring Boot 自动配置通过特性检测来工作,就像普通 Spring 在某些地方所做的一样(比如在 Hibernate 版本之间动态切换)。

功能检测通过检查框架、库或 JDK 的一些众所周知的类/方法/注释是否可用来工作。如果不是,则该功能不可用。

Spring Boot 也不例外,它只是检查一个类是否可用。在您的情况下,它适用于 Spring Data REST 和 Spring Security。用于调试 Spring Boot 会在 DEBUG 记录那些未检测到的功能。这是为了在出现问题时进行故障排除,您可以查看缺少库的哪一部分。

要禁用日志记录,请不要在 DEBUG 记录所有内容。

【讨论】:

    【解决方案2】:

    包括以下依赖

           <dependency>
                <groupId>org.springframework.data</groupId>
                <artifactId>spring-data-commons</artifactId>
                <version>1.10.0.RELEASE</version>
            </dependency>
    

    【讨论】:

    • 这似乎只是包含了一个实际上并不需要的依赖项。请参阅@M.Deinum 的评论回复(以上,对 OP 的问题)。
    【解决方案3】:

    有解释:https://github.com/spring-projects/spring-boot/issues/4121 “Spring Framework 使用 ASM 来查看字节码。在这种情况下,它发现了一个不在类路径上的注解。这意味着有关注解的元数据将不可用,仅此而已。当类实际加载时,JVM 会掉线注释,因为它不在类路径上。”

    【讨论】:

      猜你喜欢
      • 2017-08-01
      • 2021-03-10
      • 2018-08-15
      • 1970-01-01
      • 1970-01-01
      • 2016-11-27
      • 2012-05-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多