调用createJeuclidDom时遇NoClassDefFoundError: CustomEvent类缺失
问题描述
我在NetBeans开发平台上使用Maven学习Java的jeuclid-core-3.1.9,所有依赖由NetBeans根据源码中的导入自动生成。尝试将程序中字符串形式的MathML公式生成DOM后创建MathML树,调用createJeuclidDom时遇到NoClassDefFoundError异常,缺失类为org/w3c/dom/events/CustomEvent。项目窗口显示该类属于batik-ext-1.7 jar包的org.w3c.dom.events包,但选中后导航窗口无内容,说明实际不存在。怀疑存在兼容性问题,但无法确定具体原因。
源代码
/* * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license */ package com.mycompany.jeuclidtrial; import java.io.IOException; import java.io.StringReader; import javax.xml.transform.stream.StreamSource; import net.sourceforge.jeuclid.parser.Parser; import org.w3c.dom.Document; import net.sourceforge.jeuclid.DOMBuilder; import net.sourceforge.jeuclid.elements.generic.DocumentElement; import net.sourceforge.jeuclid.swing.JMathComponent; import org.xml.sax.SAXException; /** * * @author Tony */ public class JeuclidTrial { public static void main(String[] args) { String formula; formula = "<?xml version=\"1.0\"?>"; formula += "<math mode=\"content\" xmlns=\"http://www.w3.org/1998/Math/MathML\">"; formula += "<apply><power/><apply><plus/><ci>a</ci><ci>b</ci><ci>c</ci></apply><cn>2</cn></apply>"; formula += "</math>"; try { /** * This code adapted from * https://jeuclid.sourceforge.net/index.html */ StringReader aStreamReader = new StringReader(formula); StreamSource aStreamSource = new StreamSource(aStreamReader); Parser aParser = Parser.getInstance(); Document theDocument = aParser.parseStreamSource(aStreamSource); DOMBuilder dBuilder = net.sourceforge.jeuclid.DOMBuilder.getInstance(); DocumentElement theDocumentElement = dBuilder.createJeuclidDom(theDocument); JMathComponent theMathComponent = new JMathComponent(); theMathComponent.setDocument(theDocumentElement); } catch (SAXException e) { System.out.println(e.getMessage()); System.exit(0); } catch (IOException e) { System.out.println(e.getMessage()); System.exit(0); } System.out.println("Hello World!"); } }
堆栈跟踪
Exception in thread "main" java.lang.NoClassDefFoundError: org/w3c/dom/events/CustomEvent at java.base/java.lang.Class.getDeclaredFields0(Native Method) at java.base/java.lang.Class.privateGetDeclaredFields(Class.java:3297) at java.base/java.lang.Class.getField0(Class.java:3482) at java.base/java.lang.Class.getField(Class.java:2115) at net.sourceforge.jeuclid.elements.JEuclidElementFactory.addClass(JEuclidElementFactory.java:146) at net.sourceforge.jeuclid.elements.JEuclidElementFactory.<clinit>(JEuclidElementFactory.java:186) at net.sourceforge.jeuclid.elements.generic.DocumentElement.createElementNS(DocumentElement.java:165) at java.xml/com.sun.org.apache.xalan.internal.xsltc.trax.SAX2DOM.startElement(SAX2DOM.java:159) at java.xml/com.sun.org.apache.xml.internal.serializer.ToXMLSAXHandler.closeStartTag(ToXMLSAXHandler.java:206) at java.xml/com.sun.org.apache.xml.internal.serializer.ToSAXHandler.flushPending(ToSAXHandler.java:250) at java.xml/com.sun.org.apache.xml.internal.serializer.ToXMLSAXHandler.startElement(ToXMLSAXHandler.java:648) at java.xml/com.sun.org.apache.xml.internal.serializer.ToXMLSAXHandler.startElement(ToXMLSAXHandler.java:510) at jdk.translet/die.verwandlung.GregorSamsa.http$colon$$slash$$slash$www$dot$w3$dot$org$slash$1998$slash$Math$slash$MathML$colon$template$dot$34() at jdk.translet/die.verwandlung.GregorSamsa.applyTemplates() at jdk.translet/die.verwandlung.GregorSamsa.http$colon$$slash$$slash$www$dot$w3$dot$org$slash$1998$slash$Math$slash$MathML$colon$template$dot$206() at jdk.translet/die.verwandlung.GregorSamsa.applyTemplates() at jdk.translet/die.verwandlung.GregorSamsa.http$colon$$slash$$slash$www$dot$w3$dot$org$slash$1998$slash$Math$slash$MathML$colon$template$dot$0() at jdk.translet/die.verwandlung.GregorSamsa.applyTemplates() at jdk.translet/die.verwandlung.GregorSamsa.transform() at java.xml/com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet.transform(AbstractTranslet.java:627) at java.xml/com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:782) at java.xml/com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:395) at net.sourceforge.jeuclid.DOMBuilder.applyTransform(DOMBuilder.java:217) at net.sourceforge.jeuclid.DOMBuilder.createJeuclidDom(DOMBuilder.java:202) at net.sourceforge.jeuclid.DOMBuilder.createJeuclidDom(DOMBuilder.java:155) at net.sourceforge.jeuclid.DOMBuilder.createJeuclidDom(DOMBuilder.java:135) at com.mycompany.jeuclidtrial.JeuclidTrial.main(JeuclidTrial.java:42) Caused by: java.lang.ClassNotFoundException: org.w3c.dom.events.CustomEvent at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520) ... 27 more Command execution failed. org.apache.commons.exec.ExecuteException: Process exited with an error: 1 (Exit value: 1) at org.apache.commons.exec.DefaultExecutor.executeInternal (DefaultExecutor.java:404) at org.apache.commons.exec.DefaultExecutor.execute (DefaultExecutor.java:166) at org.codehaus.mojo.exec.ExecMojo.executeCommandLine (ExecMojo.java:1000) at org.codehaus.mojo.exec.ExecMojo.executeCommandLine (ExecMojo.java:947) at org.codehaus.mojo.exec.ExecMojo.execute (ExecMojo.java:471) at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:126) at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute2 (MojoExecutor.java:342) at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute (MojoExecutor.java:330) at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:213) at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:175) at org.apache.maven.lifecycle.internal.MojoExecutor.access$000 (MojoExecutor.java:76) at org.apache.maven.lifecycle.internal.MojoExecutor$1.run (MojoExecutor.java:163) at org.apache.maven.plugin.DefaultMojosExecutionStrategy.execute (DefaultMojosExecutionStrategy.java:39) at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:160) at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:105) at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:73) at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:53) at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:118) at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:261) at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:173) at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:101) at org.apache.maven.cli.MavenCli.execute (MavenCli.java:827) at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:272) at org.apache.maven.cli.MavenCli.main (MavenCli.java:195) at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:77) at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke (Method.java:568) at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:282) at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:225) at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:406) at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:347)
构建失败日志
BUILD FAILURE ------------------------------------------------------------------------ Total time: 7.466 s Finished at: 2023-09-05T09:33:22-05:00 ------------------------------------------------------------------------ Failed to execute goal org.codehaus.mojo:exec-maven-plugin:3.1.0:exec (default-cli) on project jeuclidTrial: Command execution failed.: Process exited with an error: 1 (Exit value: 1) -> [Help 1] To see the full stack trace of the errors, re-run Maven with the -e switch. Re-run Maven using the -X switch to enable full debug logging. For more information about the errors and possible solutions, please read the following articles: [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
解决方案
- 补充缺失的依赖:batik-ext-1.7确实不包含
org.w3c.dom.events.CustomEvent类,需要手动添加包含该类的依赖。在pom.xml中加入以下内容:
<dependency> <groupId>xml-apis</groupId> <artifactId>xml-apis</artifactId> <version>1.4.01</version> </dependency>
- 更新batik-ext版本:替换batik-ext-1.7为更高版本(如1.14),新版本包含所需的CustomEvent类,修改pom.xml中的batik-ext依赖版本即可。
- 重新构建项目:执行
mvn clean install命令,确保依赖正确下载并加载到项目中。 - 检查依赖范围:确认相关依赖的范围是
compile或runtime,避免运行时无法访问该类。
内容的提问来源于stack exchange,提问作者Tony Dean
相关产品推荐
相关产品推荐

