【问题标题】:ClassNotFoundException for one class but not another from same package?ClassNotFoundException 一个类但不是来自同一个包的另一个?
【发布时间】:2011-04-12 19:23:44
【问题描述】:

我正在做一个 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,并且确实如此。我已经验证这些课程是公开的,而且它们是公开的。另外,我尝试了 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

【问题讨论】:

  • 请发布完整堆栈跟踪。尤其是根本原因部分是最重要的。

标签: java packages noclassdeffounderror classnotfoundexception


【解决方案1】:

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

【讨论】:

  • +1:虽然 ClassNotFound 异常应该注意 - 它应该说“加载类 org.docx4j.wml.ParaRPr 时出错 - 找不到依赖项 X”或类似的东西(确切的语法正在转义我现在)。
  • 嗯,我也是这么想的。我刚刚发布了堆栈跟踪。
  • 如果我可以在 .jar 中看到它抱怨的文件,那应该没问题,对吧?
  • 不幸的是,java 不知道缺少哪个依赖项
  • 如果我可以查看 docx4j.jar 并查看堆栈跟踪中特别引用的文件,这仍然有意义吗?
【解决方案2】:

docx4j 有许多依赖项,如下所述:http://dev.plutext.org/trac/docx4j/wiki/Docx4jDependencies

看起来 ParaRPr 实现了 org.jvnet.jaxb2_commons 中的 Child 我相信您的运行时环境缺少包含 Child 的 jar

【讨论】:

  • 原来如此。好决定。现在我知道如何在未来开始调试这些东西了
猜你喜欢
  • 1970-01-01
  • 2015-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多