【问题标题】:spring-cloud-stream application is looking for non-existent org.springframework.integration.endpoint.Pausablespring-cloud-stream 应用程序正在寻找不存在的 org.springframework.integration.endpoint.Pausable
【发布时间】:2020-04-27 04:06:42
【问题描述】:

我根据官方示例之一尝试的一个简单的 spring-boot 应用程序由于一个奇怪的错误而失败。 spring-cloud-stream 中的某个类正在寻找 org.springframework.integration.endpoint.Pausable。

我看到 org.springframework.integration.core.Pausable(即它在不同的包中) 在 spring-integration-core-5.2.3.RELEASE.jar 中。

例子在https://github.com/spring-cloud/spring-cloud-stream-samples/tree/master/processor-samples/streamlistener-basic

EDIT #1: I'm unable to find Hoxton.BUILD-SNAPSHOT version of spring-cloud-stream-dependencies. I see the error below.

The only versions that I see are at https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-stream-dependencies

Caused by: org.eclipse.aether.transfer.ArtifactNotFoundException: Could not find artifact org.springframework.cloud:spring-cloud-stream-dependencies:pom:Hoxton.BUILD-SNAPSHOT
    at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolve (DefaultArtifactResolver.java:413)
    at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifacts (DefaultArtifactResolver.java:225)
    at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifact (DefaultArtifactResolver.java:202)
    at org.eclipse.aether.internal.impl.DefaultRepositorySystem.resolveArtifact (DefaultRepositorySystem.java:257)

我已经放置了重新创建问题所需的完整堆栈跟踪、pom 和三个源文件。

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'bindingService' defined in class path resource [org/springframework/cloud/stream/config/BindingServiceConfiguration.class]: Post-processing of merged bean definition failed; nested exception is java.lang.IllegalStateException: Failed to introspect Class [org.springframework.cloud.stream.binding.BindingService] from ClassLoader [sun.misc.Launcher$AppClassLoader@18b4aac2]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:572) ~[spring-beans-5.2.3.RELEASE.jar:5.2.3.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517) ~[spring-beans-5.2.3.RELEASE.jar:5.2.3.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323) ~[spring-beans-5.2.3.RELEASE.jar:5.2.3.RELEASE]
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.2.3.RELEASE.jar:5.2.3.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321) ~[spring-beans-5.2.3.RELEASE.jar:5.2.3.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-5.2.3.RELEASE.jar:5.2.3.RELEASE]
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:879) ~[spring-beans-5.2.3.RELEASE.jar:5.2.3.RELEASE]
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:878) ~[spring-context-5.2.3.RELEASE.jar:5.2.3.RELEASE]
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550) ~[spring-context-5.2.3.RELEASE.jar:5.2.3.RELEASE]
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747) [spring-boot-2.2.4.RELEASE.jar:2.2.4.RELEASE]
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) [spring-boot-2.2.4.RELEASE.jar:2.2.4.RELEASE]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) [spring-boot-2.2.4.RELEASE.jar:2.2.4.RELEASE]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) [spring-boot-2.2.4.RELEASE.jar:2.2.4.RELEASE]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215) [spring-boot-2.2.4.RELEASE.jar:2.2.4.RELEASE]
	at org.example.scs.TypeConversionApplication.main(TypeConversionApplication.java:10) [classes/:na]
Caused by: java.lang.IllegalStateException: Failed to introspect Class [org.springframework.cloud.stream.binding.BindingService] from ClassLoader [sun.misc.Launcher$AppClassLoader@18b4aac2]
	at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:481) ~[spring-core-5.2.3.RELEASE.jar:5.2.3.RELEASE]
	at org.springframework.util.ReflectionUtils.doWithLocalMethods(ReflectionUtils.java:321) ~[spring-core-5.2.3.RELEASE.jar:5.2.3.RELEASE]
	at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.buildLifecycleMetadata(InitDestroyAnnotationBeanPostProcessor.java:232) ~[spring-beans-5.2.3.RELEASE.jar:5.2.3.RELEASE]
	at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.findLifecycleMetadata(InitDestroyAnnotationBeanPostProcessor.java:210) ~[spring-beans-5.2.3.RELEASE.jar:5.2.3.RELEASE]
	at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessMergedBeanDefinition(InitDestroyAnnotationBeanPostProcessor.java:149) ~[spring-beans-5.2.3.RELEASE.jar:5.2.3.RELEASE]
	at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessMergedBeanDefinition(CommonAnnotationBeanPostProcessor.java:310) ~[spring-context-5.2.3.RELEASE.jar:5.2.3.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyMergedBeanDefinitionPostProcessors(AbstractAutowireCapableBeanFactory.java:1094) ~[spring-beans-5.2.3.RELEASE.jar:5.2.3.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:569) ~[spring-beans-5.2.3.RELEASE.jar:5.2.3.RELEASE]
	... 14 common frames omitted
Caused by: java.lang.NoClassDefFoundError: org/springframework/integration/endpoint/Pausable
	at java.lang.ClassLoader.defineClass1(Native Method) ~[na:1.8.0_241]
	at java.lang.ClassLoader.defineClass(ClassLoader.java:756) ~[na:1.8.0_241]
	at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) ~[na:1.8.0_241]
	at java.net.URLClassLoader.defineClass(URLClassLoader.java:468) ~[na:1.8.0_241]
	at java.net.URLClassLoader.access$100(URLClassLoader.java:74) ~[na:1.8.0_241]
	at java.net.URLClassLoader$1.run(URLClassLoader.java:369) ~[na:1.8.0_241]
	at java.net.URLClassLoader$1.run(URLClassLoader.java:363) ~[na:1.8.0_241]
	at java.security.AccessController.doPrivileged(Native Method) ~[na:1.8.0_241]
	at java.net.URLClassLoader.findClass(URLClassLoader.java:362) ~[na:1.8.0_241]
	at java.lang.ClassLoader.loadClass(ClassLoader.java:418) ~[na:1.8.0_241]
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355) ~[na:1.8.0_241]
	at java.lang.ClassLoader.loadClass(ClassLoader.java:351) ~[na:1.8.0_241]
	at java.lang.Class.getDeclaredMethods0(Native Method) ~[na:1.8.0_241]
	at java.lang.Class.privateGetDeclaredMethods(Class.java:2701) ~[na:1.8.0_241]
	at java.lang.Class.getDeclaredMethods(Class.java:1975) ~[na:1.8.0_241]
	at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:463) ~[spring-core-5.2.3.RELEASE.jar:5.2.3.RELEASE]
	... 21 common frames omitted
Caused by: java.lang.ClassNotFoundException: org.springframework.integration.endpoint.Pausable
	at java.net.URLClassLoader.findClass(URLClassLoader.java:382) ~[na:1.8.0_241]
	at java.lang.ClassLoader.loadClass(ClassLoader.java:418) ~[na:1.8.0_241]
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355) ~[na:1.8.0_241]
	at java.lang.ClassLoader.loadClass(ClassLoader.java:351) ~[na:1.8.0_241]
	... 37 common frames omitted
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class TypeConversionApplication {

    public static void main(String[] args) {
        SpringApplication.run(TypeConversionApplication.class, args);
    }
}
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.annotation.Input;
import org.springframework.cloud.stream.annotation.StreamListener;
import org.springframework.messaging.SubscribableChannel;

import org.apache.kafka.clients.consumer.ConsumerRecords;

@EnableBinding(SampleSink.Sink.class)
public class SampleSink {

    private final Log logger = LogFactory.getLog(getClass());

    // Sink application definition
    @StreamListener(Sink.SAMPLE)
    public void receive(ConsumerRecords consumerRecords) {
        logger.info("******************\nAt the Sink\n******************");
        // logger.info("Received transformed message " + foo.getValue() + " of type " + foo.getClass());
    }

    public interface Sink {
        String SAMPLE = "sample-sink";

        @Input(SAMPLE)
        SubscribableChannel sampleSink();
    }
}
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.annotation.Output;
import org.springframework.context.annotation.Bean;
import org.springframework.integration.annotation.InboundChannelAdapter;
import org.springframework.integration.annotation.Poller;
import org.springframework.integration.core.MessageSource;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.support.MessageBuilder;

@EnableBinding(SampleSource.Source.class)
public class SampleSource {

    private final Log logger = LogFactory.getLog(getClass());

    @Bean
    @InboundChannelAdapter(value = Source.SAMPLE, poller = @Poller(fixedDelay = "1000", maxMessagesPerPoll = "1"))
    public MessageSource<String> timerMessageSource() {
        return new MessageSource<String>() {
            public Message<String> receive() {
                logger.info("******************\nAt the Source\n******************");
                String value = "{\"value\":\"hi\"}";
                logger.info("Sending value: " + value);
                return MessageBuilder.withPayload(value).build();
            }
        };
    }

    public interface Source {
        String SAMPLE = "sample-source";

        @Output(SAMPLE)
        MessageChannel sampleSource();
    }
}

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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>

    <groupId>org.example</groupId>
    <artifactId>spring-cloud-stream-3-example</artifactId>
    <version>1.0-SNAPSHOT</version>


    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <kafka.client.version>2.3.1</kafka.client.version>
        <!-- spring-cloud.version>Hoxton.BUILD-SNAPSHOT</spring-cloud.version -->
        <spring-cloud.version>Brooklyn.RELEASE</spring-cloud.version>
        <spring.cloud.stream.version>2.2.1.RELEASE</spring.cloud.stream.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-stream-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-stream</artifactId>
        <version>${spring.cloud.stream.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.kafka</groupId>
            <artifactId>kafka-clients</artifactId>
            <version>${kafka.client.version}</version>
        </dependency>
    </dependencies>

</project>

【问题讨论】:

    标签: spring-integration spring-cloud-stream


    【解决方案1】:

    您的 POM 中有以下内容

    <kafka.client.version>2.3.1</kafka.client.version>
    <!-- spring-cloud.version>Hoxton.BUILD-SNAPSHOT</spring-cloud.version -->
    <spring-cloud.version>Brooklyn.RELEASE</spring-cloud.version>
    <spring.cloud.stream.version>2.2.1.RELEASE</spring.cloud.stream.version>
    

    因此,它不再是 official examples,因为您正在覆盖依赖项并且这样做会带来潜在的不兼容性。

    拥有像 Hoxton 这样的 BOM 的全部目的意味着我们确保用户具有兼容的依赖项。当然,在某些情况下,某些覆盖是可能的,在你的情况下,我不确定到底发生了什么,因为没有 spring-cloud Brooklyn。然而,布鲁克林有/曾经有 spring-cloud-stream,但这是一个非常旧的版本,不再受支持或维护(实际上已经有好几年了)。

    因此,考虑将您的示例恢复到其原始状态,至少从依赖的角度来看,然后如果您仍有问题,我们可以进一步讨论。

    【讨论】:

    • 感谢您的回复。抱歉,我没有提到在问题中使用 Hoxton.BUILD-SNAPSHOT 的问题。当我使用那个版本时,我看到了 maven 下载问题。我将使用实际错误更新问题。
    【解决方案2】:

    遇到了同样的问题,但是对于不同的 bean 创建异常,升级到 Hoxton.SR8 并解决了我的问题

    dependencyManagement {
        imports {
           mavenBom "org.springframework.cloud:spring-cloud-dependencies:Hoxton.SR8"
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-10
      • 2020-10-21
      • 1970-01-01
      • 2019-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多