使用 Spring Boot 2.4.1 启动 Eureka Client 时出错
Posted
技术标签:
【中文标题】使用 Spring Boot 2.4.1 启动 Eureka Client 时出错【英文标题】:Error starting up Eureka Client with Spring Boot 2.4.1 【发布时间】:2021-04-16 00:59:03 【问题描述】:我正在使用 Spring Boot 2.4.1 和 Eureka 开发应用程序。我成功启动了 Eureka Server,但是使用 Eureka Client 我收到以下错误:
Caused by: java.lang.ClassNotFoundException: com.sun.jersey.client.apache4.ApacheHttpClient4
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:606) ~[na:na]
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:168) ~[na:na]
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522) ~[na:na]
... 55 common frames omitted
...
Caused by: java.lang.NullPointerException: Cannot invoke "org.springframework.cloud.netflix.eureka.CloudEurekaClient.getApplications()" because the return value of "org.springframework.cloud.netflix.eureka.serviceregistry.EurekaRegistration.getEurekaClient()" is null
at org.springframework.cloud.netflix.eureka.serviceregistry.EurekaServiceRegistry.maybeInitializeClient(EurekaServiceRegistry.java:54) ~[spring-cloud-netflix-eureka-client-3.0.0.jar:3.0.0]
at org.springframework.cloud.netflix.eureka.serviceregistry.EurekaServiceRegistry.register(EurekaServiceRegistry.java:38) ~[spring-cloud-netflix-eureka-client-3.0.0.jar:3.0.0]
at org.springframework.cloud.netflix.eureka.serviceregistry.EurekaAutoServiceRegistration.start(EurekaAutoServiceRegistration.java:83) ~[spring-cloud-netflix-eureka-client-3.0.0.jar:3.0.0]
at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:178) ~[spring-context-5.3.2.jar:5.3.2]
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 https://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>2.4.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<java.version>15</java.version>
<spring-cloud.version>2020.0.0</spring-cloud.version>
</properties>
<groupId>some.group</groupId>
<artifactId>some-artefact</artifactId>
<version>1.0</version>
<name>some-name</name>
<description>some-description</description>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>$spring-cloud.version</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
以下是application.yml:
spring:
application:
name: @project.artifactId@
logging:
file.name: ../logs/@project.artifactId@.log
file.max-size: 10MB
server:
port: 8080
还有主类:
@SpringBootApplication
@ComponentScan("com.something")
@EnableDiscoveryClient
public class SpigaConnectorServiceApplication
public static void main(String[] args)
SpringApplication.run(SpigaConnectorServiceApplication.class, args);
@RestController
class ServiceInstanceRestController
@Autowired
private DiscoveryClient discoveryClient;
@RequestMapping("/service-instances/applicationName")
public List<ServiceInstance> serviceInstancesByApplicationName(
@PathVariable String applicationName)
return this.discoveryClient.getInstances(applicationName);
以下是服务器pom:
<?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 https://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>2.3.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<java.version>15</java.version>
<spring-cloud.version>Hoxton.SR1</spring-cloud.version>
</properties>
<groupId>com.ptesa.cloud</groupId>
<artifactId>pt-eureka-server</artifactId>
<version>1.0</version>
<name>pt-eureka-server</name>
<description>Registry and discovery of services</description>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>$spring-cloud.version</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
服务器的application.yml:
server:
port: 8761
eureka:
client:
registerWithEureka: false
fetchRegistry: false
以及启动服务器的类:
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication
public static void main(String[] args)
SpringApplication.run(com.ptesa.cloud.EurekaServerApplication.class);
当使用 Spring Boot 版本 2.3.7.RELEASE 时,我没有这个问题。应用程序几乎可以正常启动。只需收到以下警告:
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.thoughtworks.xstream.core.util.Fields (file:/C:/Users/Jucaalpa/.m2/repository/com/thoughtworks/xstream/xstream/1.4.11.1/xstream-1.4.11.1.jar) to field java.util.TreeMap.comparator
WARNING: Please consider reporting this to the maintainers of com.thoughtworks.xstream.core.util.Fields
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
有没有办法用 Spring Boot 2.4.1 运行 Eureka Client。由于像我遇到的兼容性问题,您认为使用 Spring Boot 2.3.7 更好吗?
谢谢。
【问题讨论】:
分享客户端配置代码 我刚刚分享了application.yml和主类。该项目没有更多的类 您提到您看到客户端错误,但共享服务器代码和配置 好的。我上传了服务器文件。 不确定,我看到@EnableEurekaServer
两次。客户不应该有@EnableDiscoveryClient
吗? spring.io/guides/gs/service-registration-and-discovery
【参考方案1】:
发现添加如下依赖,问题没有出现。
<dependency>
<groupId>com.sun.jersey.contribs</groupId>
<artifactId>jersey-apache-client4</artifactId>
<version>1.19.4</version>
</dependency>
【讨论】:
【参考方案2】:在客户端yaml文件中,添加如下配置
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://localhost:8761/eureka/
instance:
hostname: localhost
【讨论】:
【参考方案3】:可能有帮助:我将项目SDK版本从16更改为1.8,问题消失了! (在 Intellij 中转到项目结构)
【讨论】:
以上是关于使用 Spring Boot 2.4.1 启动 Eureka Client 时出错的主要内容,如果未能解决你的问题,请参考以下文章