【问题标题】:Why I am getting NoClassDefFoundError: org/reactivestreams/Publisher为什么我收到 NoClassDefFoundError: org/reactivestreams/Publisher
【发布时间】:2017-04-05 12:39:36
【问题描述】:

Stream.java

import io.reactivex.*;


public class Stream {

    public static void main(String args[])
    {

      Observable.just("Howdy!").subscribe(System.out::println);

    }
}

build.gradle:

group 'com.sakhunzai'
version '1.0-SNAPSHOT'

apply plugin: 'java'

sourceCompatibility = JavaVersion.VERSION_1_8

repositories {
    mavenCentral()
}

dependencies {
    compile 'io.reactivex.rxjava2:rxjava:2.0.5'
    testCompile group: 'junit', name: 'junit', version: '4.11'
}

例外:

Exception in thread "main" java.lang.NoClassDefFoundError: org/reactivestreams/Publisher
....
Caused by: java.lang.ClassNotFoundException: org.reactivestreams.Publisher

我在第六页关注tutorial,但我决定使用 gradle 而不是 maven

编辑

gradle 和 Intellij IDEA 可能存在一些问题

以下解决了该问题: settings.gradle:

rootProject.name = 'JavaRx'

include "buildSrc"

【问题讨论】:

  • 我认为你应该添加对 org.reactivestreams.reactive-streams 的依赖
  • 在 scala /akka 的上下文中表示下一个包未在 sbt 中指定:"org.reactivestreams" % "reactive-streams" % reactiveStreamVersion

标签: java reactivex


【解决方案1】:

异常意味着类 org.reactivestreams.Publisher 在运行时不可用。所以它在类路径中丢失了。您可以通过在 gradle 中添加依赖项引用来添加到类路径。

根据您使用的版本,它应该如下所示:

dependencies {
    compile group: 'org.reactivestreams', name: 'reactive-streams', version: '1.0.0'
    ...<the other depandancies>...
}

【讨论】:

  • 但是gradle拒绝导入依赖,什么都不做
  • 哦,对不起,就我现在所见,您指的是 maven Central。所以search.maven.org 的例子应该会更好。 (在我使用“我的”已知存储库作为参考之前)。希望这有效。如果没有,您应该检查您真正使用的存储库(以查看在您的存储库中如何定义此 depandancy)。所以,请尝试: compile 'org.reactivestreams:reactive-streams:1.0.0.final'
  • 问题是我为什么要关心依赖关系,这不就是 Gradle 的任务(获取相关依赖关系)吗?
  • gradle(以及类似的 maven 和其他依赖管理工具)将为类路径提供依赖。但是他们需要一个依赖列表,应该通过使用存储库中的库来解决。当然传递依赖是可能的,如果它们被声明(所以如果 A 需要 B,而 B 需要 C,它将为 A 解析 B 和 C)。因此,依赖管理仍然需要一个 deps 列表(带有版本),它甚至不知道您使用的库和库的版本)。对不起,如果我误解了你的评论
【解决方案2】:

我使用 org.springframework.test.web.reactive.server.WebTestClient 得到了这个异常,所以使用 spring-boot 很容易修复,只需将此依赖项添加到您的 pom.xml(对于 maven项目):

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-webflux</artifactId>
    </dependency>

【讨论】:

    【解决方案3】:

    在 gradle 中将反应流的版本强制为 1.0.0 对我有用。

    compile("org.reactivestreams:reactive-streams:1.0.0"){
        force = true
    }
    

    【讨论】:

      猜你喜欢
      • 2017-09-28
      • 2020-12-05
      • 1970-01-01
      • 1970-01-01
      • 2015-06-18
      • 2020-09-19
      相关资源
      最近更新 更多