使用Jar而不是源代码时,Xerces-for-Android NoClassDefFoundError

时间:2013-09-18 20:08:53

标签: java android ant

我正在使用Xerces-for-Android:https://code.google.com/p/xerces-for-android/

如果我将源代码复制到一个简单的测试项目(java项目,而不是android项目),我可以运行我的xml验证器测试没有任何问题。

当我从源文件中创建一个jar然后在我的类路径而不是源文件中使用它时,尽管jar中存在文件,但我得到NoClassDefFoundError

以下是错误消息:

java.lang.ExceptionInInitializerError
    at mf.org.apache.xerces.impl.dv.SchemaDVFactory.getInstance(Unknown Source)
    at mf.org.apache.xerces.impl.dv.SchemaDVFactory.getInstance(Unknown Source)
    at mf.org.apache.xerces.impl.xs.XMLSchemaLoader.reset(Unknown Source)
    at mf.org.apache.xerces.impl.xs.XMLSchemaLoader.loadGrammar(Unknown Source)
    at mf.org.apache.xerces.impl.xs.XMLSchemaLoader.loadGrammar(Unknown Source)
    at mf.org.apache.xerces.jaxp.validation.XMLSchemaFactory.newSchema(Unknown Source)
    at mf.javax.xml.validation.SchemaFactory.newSchema(Unknown Source)
    at xml.MFXMLUtil.validate(MFXMLUtil.java:33)
    at xml.MFXMLTester.main(MFXMLTester.java:8)
Caused by: java.lang.RuntimeException: internal error
    at mf.org.apache.xerces.impl.dv.xs.XSSimpleTypeDecl.applyFacets1(Unknown Source)
    at mf.org.apache.xerces.impl.dv.xs.BaseSchemaDVFactory.createBuiltInTypes(Unknown Source)
    at mf.org.apache.xerces.impl.dv.xs.SchemaDVFactoryImpl.createBuiltInTypes(Unknown Source)
    at mf.org.apache.xerces.impl.dv.xs.SchemaDVFactoryImpl.<clinit>(Unknown Source)
    ... 9 more

下面是制作jar的蚂蚁脚本:

<project name="XercesForAndroid" default="dist" basedir=".">
    <description>
        Builds jar for Xerces-For-Android
    </description>
  <!-- set global properties for this build -->
  <property name="src" location="src"/>
  <property name="build" location="build"/>
  <property name="dist"  location="dist"/>

  <target name="init">
    <!-- Create the build directory structure used by compile -->
    <mkdir dir="${build}"/>
  </target>

  <target name="compile" depends="clean, init" description="compile the source " >
    <!-- Compile the java code from ${src} into ${build} -->
    <javac verbose="true" target="1.6" srcdir="${src}" destdir="${build}"/>
  </target>

  <target name="dist" depends="compile"
        description="generate the distribution" >
    <!-- Create the distribution directory -->
    <mkdir dir="${dist}/lib"/>

    <!-- Put everything in ${build} into the .jar file -->
    <jar jarfile="${dist}/lib/Xerces-For-Android.jar" basedir="${build}"/>
  </target>

  <target name="clean"
        description="clean up" >
    <!-- Delete the ${build} and ${dist} directory trees -->
    <delete dir="${build}"/>
    <delete dir="${dist}"/>
  </target>
</project>

jar文件中存在类文件。我是否需要在清单中做任何特别的事情,或者我错过了一些明显的东西?

2 个答案:

答案 0 :(得分:2)

在android项目中,你必须将你的jar文件添加到libs /文件夹,ADT会自动将它添加到类路径中。如果你使用构建路径/添加jar在eclipse中添加旧方法,它将不会在运行时找到jar。

只需取出你的jar文件并将它们放在libs /文件夹中,ADT将负责其余的

答案 1 :(得分:1)

我与该项目的作者联系。他们使用eclipse导出jar文件。我注意到eclipse导出的jar文件和我的ant jar文件之间的jar大小差异。

我不确定我的蚂蚁脚本中缺少了什么(甚至尝试了**/*,但没有取得胜利),但下面是详细信息,以防任何人遇到同样的问题。

File -> Export -> Java / JAR File -> Check "Export all output folders for checked projects"

下面是我用来让jar正常工作的设置的屏幕截图:

enter image description here