Java 一个类的ClassNotFoundException,而不是同一个包中的另一个类的ClassNotFoundException?

Java 一个类的ClassNotFoundException,而不是同一个包中的另一个类的ClassNotFoundException?,java,packages,noclassdeffounderror,classnotfoundexception,Java,Packages,Noclassdeffounderror,Classnotfoundexception,我正在处理一个grails项目,并在项目的lib目录中放置了一个.jar文件 我一直在grails项目中使用的一个java文件中获取ClassNotFoundException的运行时异常 我有一个这样定义的方法: void printValues(org.docx4j.wml.ParaRPr rpr){ } 我有一个和导入部分,看起来像 import org.docx4j.openpackaging.exceptions.Docx4JException; import org.docx4

我正在处理一个grails项目,并在项目的lib目录中放置了一个.jar文件

我一直在grails项目中使用的一个java文件中获取ClassNotFoundException的运行时异常

我有一个这样定义的方法:

void printValues(org.docx4j.wml.ParaRPr rpr){
}
我有一个和导入部分,看起来像

 import org.docx4j.openpackaging.exceptions.Docx4JException;
 import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
 import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;
 import org.docx4j.wml.Body;
 import org.docx4j.wml.Style;
这就是抛出异常的原因

但是,如果我改变我的方法

void printValues(org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart rpr){
}
我没有遇到运行时异常

这里可能发生了什么?我已经验证了docx4j.jar文件包含ParaRPr,它确实包含ParaRPr。我已经验证了这些类是公共的,它们是公共的。此外,我还尝试了org.docx4j.wml目录中的不同类,有些类给出了异常,有些则没有。这怎么可能呢

以下是完整的堆栈跟踪:

 2010-09-15 12:37:00,198 [http-8080-1] ERROR errors.GrailsExceptionResolver  - org.docx4j.wml.ParaRPr
 java.lang.ClassNotFoundException: org.docx4j.wml.ParaRPr
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2427)
    at java.lang.Class.getDeclaredMethods(Class.java:1791)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.codehaus.groovy.util.LazyReference.getLocked(LazyReference.java:46)
    at org.codehaus.groovy.util.LazyReference.get(LazyReference.java:33)
    at javatest.ResumeController$_closure4.doCall(ResumeController.groovy:47)
    at javatest.ResumeController$_closure4.doCall(ResumeController.groovy)
    at java.lang.Thread.run(Thread.java:619)
   [groovyc] Compiling 1 source file to C:\dev\JavaTest\target\classes
下面是jar文件上jar-tf的输出,显示了其中的ParaRPr类

$ jar -tf docx4j-nightly-20100914.jar  | grep Para
org/docx4j/dml/CTTextParagraph.class
org/docx4j/dml/CTTextParagraphProperties.class
org/docx4j/dml/diagram/CTParameter.class
org/docx4j/dml/diagram/STParameterId.class
org/docx4j/math/CTOMathPara.class
org/docx4j/math/CTOMathParaPr.class
org/docx4j/model/properties/paragraph/AbstractParagraphProperty.class
org/docx4j/wml/CTParaRPrOriginal.class
org/docx4j/wml/ParaRPr.class
org/docx4j/wml/ParaRPrChange.class
org/pptx4j/pml/CTTLBuildParagraph.class
org/pptx4j/pml/CTTLTimeNodeParallel.class
org/pptx4j/pml/STTLParaBuildType.class
org/xlsx4j/sml/CTParameter.class
org/xlsx4j/sml/CTParameters.class
org/xlsx4j/sml/STParameterType.class

您可能缺少docx4j.jar所依赖的jar。

docx4j有许多依赖项,如下所述:


看起来ParaRPr实现了org.jvnet.jaxb2_commons中的Child,我相信您的运行时环境缺少包含Child的jar,请发布完整的stacktrace。特别是根本原因部分是最重要的。+1:尽管ClassNotFound异常应该注意到-它应该说“错误加载类org.docx4j.wml.ParaRPr-找不到依赖项X”或类似的内容(我目前无法理解确切的语法)。Hrmm,我也会这么认为。我刚刚发布了stacktrace。看起来如果我能在.jar中看到它抱怨的文件,那么它应该没问题,对吧?不幸的是,java没有告诉我丢失了哪个依赖项。如果我能查看docx4j.jar并看到堆栈跟踪中特别引用的文件,这仍然有意义吗?这正是它所做的。好电话。现在我知道以后如何开始调试这些东西了