Maven WebClient 依赖错误(在 Docker 容器中)
Maven WebClient dependency errors (in Docker container)
当我尝试在 Docker 容器内的 Java Spring 中使用 WebClient 连接到 REST 服务时出现错误。我想知道是否有人可以告诉我问题出在哪里?
运行时错误:java.lang.NoClassDefFoundError: org/springframework/http/client/reactive/ClientHttpConnector
依赖关系:
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-webflux -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
<version>2.4.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.projectreactor.netty/reactor-netty -->
<dependency>
<groupId>io.projectreactor.netty</groupId>
<artifactId>reactor-netty</artifactId>
<version>1.0.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.projectreactor/reactor-core -->
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-core</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
<!-- Servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
Docker文件:
FROM tomcat:8-jre8
RUN ["rm", "-rf", "/usr/local/tomcat/webapps/ROOT"]
COPY mvctest.war /usr/local/tomcat/webapps/ROOT.war
CMD ["catalina.sh", "run"]
我认为这与您 运行 正在 Docker 中并没有真正的关系。
可能是 spring 版本冲突的原因。在您提供的 pom 中,spring boot 2.x
与 spring 5.x
jar 一起工作,但是您调出了 4.3.9.RELEASE
of spring-web
和webmvc
.
通常你应该完全忽略 jar 版本,spring boot 将添加所有相关的传递依赖项。
另一件可能有问题的事情是您试图同时使用 webflux 和 webmvc。它可能在 spring 启动时,但首先要考虑它是否真的是你需要的。
要查看确切的版本 - 删除所有 spring 相关的依赖项和 运行 mvn dependency:tree
- 你会看到树将显示哪些 spring 版本。
当我尝试在 Docker 容器内的 Java Spring 中使用 WebClient 连接到 REST 服务时出现错误。我想知道是否有人可以告诉我问题出在哪里?
运行时错误:java.lang.NoClassDefFoundError: org/springframework/http/client/reactive/ClientHttpConnector
依赖关系:
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-webflux -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
<version>2.4.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.projectreactor.netty/reactor-netty -->
<dependency>
<groupId>io.projectreactor.netty</groupId>
<artifactId>reactor-netty</artifactId>
<version>1.0.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.projectreactor/reactor-core -->
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-core</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
<!-- Servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
Docker文件:
FROM tomcat:8-jre8
RUN ["rm", "-rf", "/usr/local/tomcat/webapps/ROOT"]
COPY mvctest.war /usr/local/tomcat/webapps/ROOT.war
CMD ["catalina.sh", "run"]
我认为这与您 运行 正在 Docker 中并没有真正的关系。
可能是 spring 版本冲突的原因。在您提供的 pom 中,spring boot 2.x
与 spring 5.x
jar 一起工作,但是您调出了 4.3.9.RELEASE
of spring-web
和webmvc
.
通常你应该完全忽略 jar 版本,spring boot 将添加所有相关的传递依赖项。
另一件可能有问题的事情是您试图同时使用 webflux 和 webmvc。它可能在 spring 启动时,但首先要考虑它是否真的是你需要的。
要查看确切的版本 - 删除所有 spring 相关的依赖项和 运行 mvn dependency:tree
- 你会看到树将显示哪些 spring 版本。