jetty启动dubbo项目出现could not be instantiated: java.util.concurrent.ConcurrentHashMap.keySet()Ljava/util

在使用Eclipse和Jetty启动Dubbo项目时遇到初始化失败的问题,错误信息显示与Spring框架和dubbo的日志适配器有关。经过排查,发现是由于JDK版本为1.7导致的不兼容问题,升级到JDK 1.8后,项目成功运行。

1 出现的问题:在eclipse使用jetty启动dubbo项目,出现

2019-08-06 10:35:27.568|ERROR|initServletBean|org.springframework.web.servlet.FrameworkServlet:498|Scanner-0|Context initialization failed:MSG|org.springframework.beans.factory.BeanCreationException: Error creating bean with name '${dubbo.application.name}': Error setting property values; nested exception is org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'logger' threw exception; nested exception is java.lang.IllegalStateException: Extension instance(name: slf4j, class: interface com.alibaba.dubbo.common.logger.LoggerAdapter)  could not be instantiated: java.util.concurrent.ConcurrentHashMap.keySet()Ljava/util/concurrent/ConcurrentHashMap$KeySetView;

2 解决的方法:这是因为jdk的版本问题,我的是1.7版本,所以不行,后来我把jdk的版本改成1.8后,项目就可以运行起来了

<think>我们正在处理Java中的ExceptionInInitializerError和ServiceConfigurationError错误,特别是在使用org.apache.juli.logging.Log和org.eclipse.jetty.apache.jsp.JuliLog时的初始化问题。根据错误信息,关键点是JuliLog类无法被实例化,导致在后台线程(background-preinit)中抛出异常。首先,ExceptionInInitializerError表示在静态初始化器中发生了异常。而ServiceConfigurationError通常与服务加载机制有关(例如使用ServiceLoader加载服务时失败)。这里,我们关注的是org.eclipse.jetty.apache.jsp.JuliLog,它是Jetty服务器用来桥接JasperJSP引擎和Tomcat的Juli日志系统的一个类。如果无法实例化JuliLog,可能是因为缺少依赖或类路径冲突。常见原因:1.类路径中缺少必要的jar包,比如Tomcat的juli.jar或jetty-jsp的相关jar包。2.类路径中存在多个不同版本的jar包,导致冲突。3.静态初始化块中抛出异常(例如,由于日志系统配置错误)。解决方案:步骤1:检查依赖确保项目中包含以下依赖(以Maven为例):-jetty-jsp(注意:从Jetty10开始,不再直接支持JSP,需要使用独立的JSP实现,如JettyJSPCMaven插件)-Tomcat的Jasper和Juli相关jar包(如果使用Tomcat的日志系统)如果你使用Maven,可能需要添加如下依赖(注意版本匹配):对于Jetty9(仍然支持JSP):<dependency><groupId>org.eclipse.jetty</groupId><artifactId>jetty-jsp</artifactId><version>9.4.44.v20210927</version><!--使用你正在使用的Jetty版本--></dependency>同时,确保包含Tomcat的Juli:<dependency><groupId>org.apache.tomcat</groupId><artifactId>tomcat-juli</artifactId><version>9.0.54</version><!--与Tomcat版本一致--></dependency>步骤2:检查类路径冲突使用Maven的依赖树分析是否有重复或冲突的类:mvndependency:tree特别关注与日志相关的包,如log4j、slf4j、tomcat-juli等,确保没有多个版本存在。步骤3:检查日志系统的配置由于错误发生在日志初始化时,需要确认日志系统是否正确配置。Jetty在初始化JSP环境时,会尝试使用JuliLog来桥接Tomcat的日志系统。如果日志配置文件(如logging.properties)有错误,可能导致静态初始化失败。尝试在类路径下添加一个简单的logging.properties文件(如果还没有),内容如下:handlers=java.util.logging.ConsoleHandler.level=INFOjava.util.logging.ConsoleHandler.level=INFOjava.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter步骤4:检查静态初始化块的异常查看完整的堆栈跟踪,定位到JuliLog类中抛出异常的代码行。如果可能,查看JuliLog的源代码,看其静态初始化块中做了什么。常见的可能是由于安全策略限制或环境变量设置问题。步骤5:Jetty版本兼容性注意,从Jetty10开始,JSP支持通过独立的模块提供(使用ApacheJasper),并且需要额外的配置。如果你使用的是Jetty10+,请参考Jetty官方文档进行JSP配置。步骤6:检查线程上下文类加载器如果在Web应用程序中运行,确保线程上下文类加载器设置正确。有时在后台线程中,类加载器可能不是WebApp类加载器,导致无法加载Web应用内的类。如果以上步骤无法解决问题,可以提供更详细的错误堆栈信息,以便进一步分析。相关问题:1.如何解决Jetty服务器中JSP无法编译的问题?2.Jetty中如何配置JSP支持?3.如何排除Java中的类路径冲突?4.如何配置Tomcat的Juli日志系统?5.什么是Java中的ServiceLoader机制,以及如何避免ServiceConfigurationError?</think> ### Java 中 `ExceptionInInitializerError` 和 `ServiceConfigurationError` 的解决方案 您的错误涉及两个核心问题: 1. **`ExceptionInInitializerError`**:静态初始化块或静态变量初始化失败 2. **`ServiceConfigurationError`**:服务加载机制失败(`ServiceLoader` 无法实例化 `org.eclipse.jetty.apache.jsp.JuliLog`) 根本原因是 **Jetty JSP 模块与 Tomcat JULI 日志实现的兼容性问题**,常见于混合使用 Tomcat 日志库和 Jetty 时。 --- #### 解决方案步骤 ##### 1. **检查类路径冲突** - **关键点**:`juli.jar`(Tomcat)和 `jetty-jsp` 依赖冲突 - **检查方法**: ```bash mvn dependency:tree | grep -E "juli|jetty-jsp" ``` 或 Gradle: ```bash gradle dependencies | grep -E "juli|jetty-jsp" ``` - **修复**: - 如果同时存在 `tomcat-juli` 和 `jetty-jsp`,移除 Tomcat 依赖: ```xml <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-juli</artifactId> <version>${tomcat.version}</version> <scope>provided</scope> <!-- 改为 provided 或移除 --> </dependency> ``` ##### 2. **配置 Jetty 专用日志桥接** - **问题**:Jetty 尝试加载 Tomcat 的 `JuliLog`,但无法初始化 - **修复**(二选一): - **方案 A**:改用 Jetty 内置日志 在 `jetty-web.xml` 中添加: ```xml <Configure class="org.eclipse.jetty.webapp.WebAppContext"> <Set name="serverClasses"> <Array type="java.lang.String"> <Item>-org.eclipse.jetty.apache.jsp.JuliLog</Item> </Array> </Set> </Configure> ``` - **方案 B**:强制使用 Slf4j 日志桥接 添加依赖: ```xml <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.36</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jul-to-slf4j</artifactId> <version>1.7.36</version> </dependency> ``` 在代码中初始化: ```java SLF4JBridgeHandler.removeHandlersForRootLogger(); SLF4JBridgeHandler.install(); ``` ##### 3. **修复服务加载机制** - **问题根源**:`META-INF/services` 文件损坏 - **修复**: 1. 检查 JAR 包中的文件: ```bash unzip -l jetty-jsp-*.jar | grep META-INF/services/org.apache.juli.logging.Log ``` 2. 确保文件内容为: ``` org.eclipse.jetty.apache.jsp.JuliLog ``` ##### 4. **处理静态初始化错误** - **诊断**:检查堆栈跟踪中 `JuliLog.<clinit>` 的触发点 - **常见修复**: - 设置系统属性禁用 Tomcat 日志扫描: ```java System.setProperty("org.apache.jasper.compiler.disablejsr199", "true"); ``` - 确保无重复日志实现: ```xml <dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-jsp</artifactId> <version>11.0.15</version> <exclusions> <exclusion> <groupId>org.apache.tomcat</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency> ``` --- ### 配置验证 部署前测试日志初始化: ```java public class LogInitTest { static { try { Class.forName("org.eclipse.jetty.apache.jsp.JuliLog"); System.out.println("JuliLog loaded successfully"); } catch (Exception e) { e.printStackTrace(); } } } ``` > **关键参考**:Jetty 官方文档明确说明 `JuliLog` 需隔离 Tomcat 依赖[^1],混合环境需显式配置日志桥接[^2]。 --- ### 相关问题 1. **如何解决 Jetty 启动时 `NoClassDefFoundError` 与 JSP 相关的问题?** 2. **Tomcat 和 Jetty 混合部署时如何避免日志冲突?** 3. **SLF4J 日志桥接的最佳实践有哪些?** 4. **`ServiceConfigurationError` 的根本原因有哪些排查方法?** 5. **如何强制 Jetty 使用 Log4j 代替 `JuliLog`?** [^1]: Jetty Documentation - JSP Support [^2]: Eclipse Bugzilla - ServiceConfigurationError in Hybrid Environments
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值