DeploymentUtil.isSourceFolder(Unknown Source) 问题解决

本文介绍了解决MyEclipse部署工程时出现的NullPointer异常问题。通过分析.log文件定位到部署时未能找到正确的WebRoot路径,并给出了手动修改.mymetadata文件的方法来修正此问题。

1.安装后,部署工程hmsi时,出现error的一个错误对话框,但是没有错误信息。

2.检查.log文件,发现错误为java.lang.NullPointerException
at com.genuitec.eclipse.ast.deploy.core.DeploymentUtil.isSourceFolder(Unknown Source)
at com.genuitec.eclipse.ast.deploy.core.DeploymentUtil.copyContainer(Unknown Source)
at com.genuitec.eclipse.ast.deploy.core.DeploymentUtil.copyContainer(Unknown Source)
at com.genuitec.eclipse.ast.deploy.core.Deployment.resyncAll(Unknown Source)
at com.genuitec.eclipse.ast.deploy.core.DeploymentBuilder.webProjectBuildAll(Unknown Source)
at com.genuitec.eclipse.ast.deploy.core.DeploymentBuilder.buildAll(Unknown Source)
at com.genuitec.eclipse.ast.deploy.core.DeploymentBuilder.build(Unknown Source)
at org.eclipse.core.internal.events.BuildManager$2.run(BuildManager.java:593)
at org.eclipse.core.internal.runtime.InternalPlatform.run(InternalPlatform.java:1044)
at org.eclipse.core.runtime.Platform.run(Platform.java:783)
at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:168)
at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:202)
at org.eclipse.core.internal.events.BuildManager$1.run(BuildManager.java:231)
at org.eclipse.core.internal.runtime.InternalPlatform.run(InternalPlatform.java:1044)
at org.eclipse.core.runtime.Platform.run(Platform.java:783)
at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:234)
at org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:253)
at org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:282)
at org.eclipse.core.internal.events.AutoBuildJob.doBuild(AutoBuildJob.java:139)
at org.eclipse.core.internal.events.AutoBuildJob.run(AutoBuildJob.java:200)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:76)

3.经过分析,错误应该是在部署时找不到WebRoot,经在myeclipse-web中检查WebRoot,是/WebRoot,而我们的webroot应该是EAPDomain。

4.手工修改.mymetadata

<?xml version="1.0" encoding="UTF-8"?>
<project-module
type="WEB"
name="hmsi"
id="myeclipse.1122346865314"
context-root="/eapdomain"
j2ee-spec="1.4"
archive="hmsi.war">
<attributes>
<attribute name="webrootdir" value="EAPDomain" />
</attributes>
</project-module>

注意value="EAPDomain",不能加/。而且修改完成后再重新启动,检查webroot是否被修改过来。修改过来后就好用了。注意这个文件的修改不能从eclipse中进行。

5.也可以新建一个工程,将其中的.mymetadata拷贝过来

java.lang.NoClassDefFoundError: Could not initialize class jdk.nashorn.internal.parser.Lexer at jdk.nashorn.internal.parser.Parser.parse(Parser.java:275) at jdk.nashorn.internal.parser.Parser.parse(Parser.java:249) at jdk.nashorn.internal.runtime.Context.compile(Context.java:1286) at jdk.nashorn.internal.runtime.Context.compileScript(Context.java:1253) at jdk.nashorn.internal.runtime.Context.compileScript(Context.java:625) at jdk.nashorn.api.scripting.NashornScriptEngine.compileImpl(NashornScriptEngine.java:532) at jdk.nashorn.api.scripting.NashornScriptEngine.compileImpl(NashornScriptEngine.java:521) at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:399) at jdk.nashorn.api.scripting.NashornScriptEngine.eval(NashornScriptEngine.java:155) at javax.script.AbstractScriptEngine.eval(Unknown Source) at com.sun.deploy.net.proxy.SunAutoProxyHandler.jsGetProxyInfo(Unknown Source) at com.sun.deploy.net.proxy.SunAutoProxyHandler.access$100(Unknown Source) at com.sun.deploy.net.proxy.SunAutoProxyHandler$2.run(Unknown Source) at com.sun.deploy.net.proxy.SunAutoProxyHandler$2.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at com.sun.deploy.net.proxy.SunAutoProxyHandler.jsGetProxyInfo(Unknown Source) at com.sun.deploy.net.proxy.SunAutoProxyHandler.getProxyInfo(Unknown Source) at com.sun.deploy.net.proxy.DynamicProxyManager.getProxyList(Unknown Source) at com.sun.deploy.net.proxy.DeployProxySelector.select(Unknown Source) at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(Unknown Source) at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source) at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source) at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(Unknown Source) at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source) at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(Unknown Source) at com.cisco.launcher.s.new(Unknown Source) at com.cisco.launcher.s.actionPerformed(Unknown Source) at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.setPressed(Unknown Source) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) at java.awt.Component.processMouseEvent(Unknown Source) at javax.swing.JComponent.processMouseEvent(Unknown Source) at java.awt.Component.processEvent(Unknown Source) at java.awt.Container.processEvent(Unknown Source) at java.awt.Component.dispatchEventImpl(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Window.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.EventQueue.dispatchEventImpl(Unknown Source) at java.awt.EventQueue.access$500(Unknown Source) at java.awt.EventQueue$3.run(Unknown Source) at java.awt.EventQueue$3.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) at java.awt.EventQueue$4.run(Unknown Source) at java.awt.EventQueue$4.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source) Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at com.cisco.launcher.s.new(Unknown Source) at com.cisco.launcher.s.actionPerformed(Unknown Source) at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.setPressed(Unknown Source) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) at java.awt.Component.processMouseEvent(Unknown Source) at javax.swing.JComponent.processMouseEvent(Unknown Source) at java.awt.Component.processEvent(Unknown Source) at java.awt.Container.processEvent(Unknown Source) at java.awt.Component.dispatchEventImpl(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Window.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.EventQueue.dispatchEventImpl(Unknown Source) at java.awt.EventQueue.access$500(Unknown Source) at java.awt.EventQueue$3.run(Unknown Source) at java.awt.EventQueue$3.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) at java.awt.EventQueue$4.run(Unknown Source) at java.awt.EventQueue$4.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source) 这个问题如何处理
最新发布
10-01
<think>我们正在处理一个Java运行时异常问题,具体是`java.lang.NoClassDefFoundError: Could not initialize class jdk.nashorn.internal.parser.Lexer`,并且后续还出现了`java.lang.NullPointerException`。根据提供的站内引用,我们可以分析原因并寻找解决方案。 首先,`NoClassDefFoundError`表示JVM在运行时尝试加载某个类(这里是`jdk.nashorn.internal.parser.Lexer`)但找不到它的定义。注意,这与`ClassNotFoundException`不同,`ClassNotFoundException`是在类加载器试图加载类时找不到类路径的情况,而`NoClassDefFoundError`是在编译时类存在,但运行时由于某些原因不可用。特别地,错误信息中的“Could not initialize class”表明类加载过程中初始化阶段失败。 参考引用[1]和[2]提到的原因,可能是由于类初始化失败(比如静态变量初始化失败或静态代码块中抛出异常)导致。引用[3]则提到可能是依赖冲突(如版本冲突)导致。 针对这个特定的类`jdk.nashorn.internal.parser.Lexer`,它是JDK中Nashorn引擎的一部分,用于解析JavaScript。因此,问题可能与Nashorn引擎相关。 **原因分析:** 1. **类初始化失败(静态代码块或静态变量初始化问题)**:在类加载的初始化阶段,如果静态代码块或静态变量初始化抛出异常,那么该类将无法被初始化,并且随后对该类的任何访问都会抛出`NoClassDefFoundError`。 2. **依赖冲突或版本问题**:可能有多个版本的Nashorn相关类被加载(例如,不同版本的JAR包冲突),或者与Nashorn相关的依赖在运行时被破坏。 3. **JDK问题**:可能是JDK本身的bug或损坏。 4. **后续`NullPointerException`**:这可能是由于`NoClassDefFoundError`导致某些对象未能正确初始化,从而在使用时出现空指针。 **解决步骤:** 1. **检查静态初始化代码**:虽然`jdk.nashorn.internal.parser.Lexer`是JDK内部的类,我们无法直接修改,但我们需要检查是否有自定义代码触发了这个类的初始化,并且是否在初始化时发生了异常。可以通过查看异常堆栈跟踪来确定是在执行哪段代码时发生了这个错误。 2. **检查运行时环境**: - 确保使用的JDK版本是官方版本,并且没有损坏。可以尝试重新安装JDK。 - 检查是否在项目中引入了与Nashorn相关的其他依赖,例如不同版本的Nashorn引擎。如果有,尝试排除冲突的依赖。 3. **检查依赖冲突**:使用Maven或Gradle的依赖树分析工具,查看是否有依赖冲突。例如,在Maven中可以使用`mvn dependency:tree`命令,检查是否有多个不同版本的Nashorn相关库。 4. **升级JDK**:如果当前使用的JDK版本存在已知的与Nashorn相关的bug,尝试升级到更新的JDK版本(注意:Nashorn在JDK 15以后被标记为废弃,但JDK 1.8中仍然存在)。 5. **尝试禁用Nashorn**:如果不使用Nashorn,可以考虑禁用Nashorn引擎。可以通过启动参数来禁用:`-Dnashorn.args=--no-deprecation-warning`(但可能不够彻底)。或者,如果项目中确实不需要JavaScript功能,可以排除相关依赖。 6. **捕获错误并处理**:如果以上方法不可行,考虑在代码中捕获这个错误,并做相应的处理(比如回退操作)。但是,这通常不是根本解决方案。 **具体操作建议:** - 首先,查看完整的异常堆栈,确定是哪一行代码触发了`NoClassDefFoundError`。这将帮助我们缩小问题范围。 - 如果堆栈指向应用代码,检查该代码是否有静态初始化块或静态变量初始化可能抛出异常。 - 如果堆栈指向第三方库或JDK内部,则考虑依赖冲突或JDK问题。 根据引用[3]的经验,依赖冲突是常见原因。因此,重点检查项目中是否引入了与JDK内置模块冲突的库,特别是与Nashorn相关的库(例如,某些旧版本的库可能包含了Nashorn类)。 **示例:排除冲突依赖(Maven)** ```xml <dependency> <groupId>some.group</groupId> <artifactId>some-artifact</artifactId> <version>version</version> <exclusions> <exclusion> <groupId>org.openjdk.nashorn</groupId> <artifactId>nashorn-core</artifactId> </exclusion> </exclusions> </dependency> ``` **注意:** 由于`jdk.nashorn.internal.parser.Lexer`是JDK内部的类,通常不会由外部依赖提供,所以冲突可能是间接的(比如通过其他依赖引入的Nashorn版本与JDK内置版本冲突)。因此,需要排除掉外部依赖中的Nashorn库。 如果问题依然存在,考虑升级JDK到最新版本(如JDK 8u最新版本),因为可能遇到了已知的bug,新版本已修复。 最后,关于后续的`NullPointerException`,这很可能是由于`NoClassDefFoundError`导致某个类无法初始化,从而在使用时出现空指针。因此,解决了`NoClassDefFoundError`,空指针问题可能也会随之解决。 如果上述方法都无法解决,建议在项目中最小化复现问题的代码,并在社区寻求帮助,同时提供JDK版本、依赖列表和完整的错误堆栈。 §§相关问题§§ 1. 如何排查Java中的依赖冲突? 2. 如何处理Java静态代码块中可能出现的异常? 3. JDK内置类加载失败有哪些常见原因? </think>### 解决 `java.lang.NoClassDefFoundError: Could not initialize class jdk.nashorn.internal.parser.Lexer` 及后续 `NullPointerException` 的方法 #### 问题本质分析 1. **`NoClassDefFoundError` 根源** 此错误表示 JVM 在运行时无法初始化 `jdk.nashorn.internal.parser.Lexer` 类(Nashorn JavaScript 引擎的解析器组件),通常由以下原因导致: - ✅ **静态初始化失败**:类中静态代码块或静态变量初始化抛出异常(引用[1][2]) - ✅ **依赖冲突**:多个库提供相同类但版本不兼容(引用[3]) - ❌ **类路径缺失**:编译存在但运行时缺少相关 JAR(`NoClassDefFoundError` 与 `ClassNotFoundException` 的区别) 2. **`NullPointerException` 连锁反应** 通常是 `NoClassDefFoundError` 导致 Nashorn 引擎未初始化,后续调用相关方法时对象为 `null` 引发。 --- #### 解决方案步骤 ##### 1. 检查静态初始化问题(首要排查) ```java // 示例:Lexer 类静态代码块可能存在的错误 public class Lexer { static { // 静态初始化代码(可能抛出异常) System.loadLibrary("nashorn"); // 可能因路径问题失败 } } ``` **操作建议**: - 检查 JDK 安装目录(`${JAVA_HOME}/jre/bin`)是否缺失 `nashorn.dll`/`libnashorn.so` - 确认环境变量 `LD_LIBRARY_PATH`(Linux)或 `PATH`(Windows)包含 JDK `bin` 目录 - 添加 JVM 参数捕获初始化异常: ```bash -XX:+TraceClassLoading -XX:+TraceClassInitialization ``` ##### 2. 解决依赖冲突(最常见原因) **排查流程**: ```mermaid graph TD A[运行 mvn dependency:tree] --> B[搜索 nashorn-core/jackson] B --> C{发现多个版本} C -->|是| D[排除冲突依赖] C -->|否| E[检查JDK工具链] ``` **具体操作**: ```xml <!-- Maven 排除冲突示例(常见冲突库) --> <dependency> <groupId>org.openjdk.nashorn</groupId> <artifactId>nashorn-core</artifactId> <version>15.4</version> <exclusions> <exclusion> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency> ``` ⚠️ **特别注意**:Spring Boot 2.x+ 默认使用 GraalVM 替代 Nashorn,需显式添加依赖: ```xml <dependency> <groupId>org.openjdk.nashorn</groupId> <artifactId>nashorn-core</artifactId> <version>15.4</version> </dependency> ``` ##### 3. JDK 问题修复 - **验证 JDK 完整性**: ```bash cd $JAVA_HOME/bin ./java -version # 观察是否报错 ``` - **重装/升级 JDK**: - 建议使用 JDK 11+(Nashorn 维护更活跃) - 或回退到 LTS 版本如 JDK 1.8u321 ##### 4. 运行时修复(临时方案) ```java try { ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn"); } catch (NoClassDefFoundError e) { // 降级到 Rhino 引擎 ScriptEngine engine = new ScriptEngineManager().getEngineByName("javascript"); } ``` --- #### 典型案例参考 > 某用户因 `activiti` 与 `nashorn-core` 冲突导致相同错误。 > 解决方案:排除 `activiti-common-rest` 中的旧版 Nashorn 依赖[^3]。 > ```xml > <exclusion> > <groupId>org.openjdk.nashorn</groupId> > <artifactId>nashorn-core</artifactId> > </exclusion> > ``` --- ### 关键预防措施 1. 统一依赖版本管理(Maven BOM 或 Gradle platform) 2. 在 Docker 基础镜像中固定 JDK 版本 3. 关键服务添加静态初始化异常监控: ```java static { try { ... } catch (Throwable t) { Sentry.captureException(t); // 上报异常 } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值