我有一个正在使用的开源 Java 项目。当我直接使用源代码时,一切正常,但是当我尝试从代码中制作一个 jar 并通过 jar 引用相同的类时,我得到ExceptionInInitlaizerError
了Unknown Source
. 稍后,它显示NoClassDefFoundError
. 以下是 4 次测试运行的堆栈跟踪:
用 jar 输出:
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
Test 1: false
java.lang.NoClassDefFoundError: Could not initialize class mf.org.apache.xerces.impl.dv.xs.SchemaDVFactoryImpl
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:11)
Test 2: false
java.lang.NoClassDefFoundError: Could not initialize class mf.org.apache.xerces.impl.dv.xs.SchemaDVFactoryImpl
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:14)
Test 3: false
java.lang.NoClassDefFoundError: Could not initialize class mf.org.apache.xerces.impl.dv.xs.SchemaDVFactoryImpl
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:17)
Test 4: false
如果我将所有源包直接复制到项目中,并运行相同的代码,那么我会得到正确的输出:
Test 1: true
Test 2: true
Test 3: true
Test 4: true
我创建了另一个测试 jar,以确保我的震动过程是正确的并且我能够正确使用它。
任何想法为什么代码可以与源代码一起使用但不能与 jar 一起使用?
EDT:根据要求制作 jar 的 ant 代码
请求有关如何创建 jar 文件的代码。我使用 jarring 的示例 ant 代码来制作 jar,以下是我的 ant 文件:
<project name="Xerces-For-Android" 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>
EDT:在带有 jar 文件的程序运行中添加了 Verbose,下面是输出的一部分
[Loaded java.lang.Object from shared objects file]
[Loaded java.io.Serializable from shared objects file]
[Loaded java.lang.Comparable from shared objects file]
[Loaded java.lang.CharSequence from shared objects file]
...
[Loaded java.lang.Enum from shared objects file]
[Loaded mf.org.apache.xerces.impl.xpath.regex.Token from file:/C:/path/to/workspace/Sandbox/libs/Xerces-For-Android.jar]
[Loaded mf.org.apache.xerces.impl.xpath.regex.Token$UnionToken from file:/C:/path/to/workspace/Sandbox/libs/Xerces-For-Android.jar]
[Loaded mf.org.apache.xerces.impl.xpath.regex.Token$ParenToken from file:/C:/path/to/workspace/Sandbox/libs/Xerces-For-Android.jar]
[Loaded mf.org.apache.xerces.impl.xpath.regex.Token$ClosureToken from file:/C:/path/to/workspace/Sandbox/libs/Xerces-For-Android.jar]
[Loaded mf.org.apache.xerces.impl.xpath.regex.Token$ConcatToken from file:/C:/path/to/workspace/Sandbox/libs/Xerces-For-Android.jar]
[Loaded mf.org.apache.xerces.impl.xpath.regex.Token$ConditionToken from file:/C:/path/to/workspace/Sandbox/libs/Xerces-For-Android.jar]
[Loaded mf.org.apache.xerces.impl.xpath.regex.Token$ModifierToken from file:/C:/path/to/workspace/Sandbox/libs/Xerces-For-Android.jar]
[Loaded mf.org.apache.xerces.impl.xpath.regex.Token$CharToken from file:/C:/path/to/workspace/Sandbox/libs/Xerces-For-Android.jar]
[Loaded mf.org.apache.xerces.impl.xpath.regex.Token$StringToken from file:/C:/path/to/workspace/Sandbox/libs/Xerces-For-Android.jar]
[Loaded mf.org.apache.xerces.impl.xpath.regex.RangeToken from file:/C:/path/to/workspace/Sandbox/libs/Xerces-For-Android.jar]
[Loaded java.util.ResourceBundle from shared objects file]
[Loaded java.util.ResourceBundle$1 from shared objects file]
[Loaded java.util.ResourceBundle$Control from shared objects file]
[Loaded java.util.Arrays$ArrayList from shared objects file]
[Loaded java.util.Collections$UnmodifiableCollection from shared objects file]
[Loaded java.util.Collections$UnmodifiableList from shared objects file]
[Loaded java.util.Collections$UnmodifiableRandomAccessList from shared objects file]
[Loaded java.util.ResourceBundle$CacheKey from shared objects file]
[Loaded java.util.ResourceBundle$CacheKeyReference from shared objects file]
[Loaded java.util.ResourceBundle$LoaderReference from shared objects file]
[Loaded java.util.ResourceBundle$Control$1 from shared objects file]
[Loaded sun.misc.Launcher$1 from shared objects file]
[Loaded sun.misc.Launcher$2 from shared objects file]
[Loaded java.net.URLClassLoader$2 from shared objects file]
[Loaded java.util.ResourceBundle$BundleReference from shared objects file]
[Loaded java.lang.ExceptionInInitializerError from shared objects file]
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
Test 1: false
java.lang.NoClassDefFoundError: Could not initialize class mf.org.apache.xerces.impl.dv.xs.SchemaDVFactoryImpl
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:11)
Test 2: false
java.lang.NoClassDefFoundError: Could not initialize class mf.org.apache.xerces.impl.dv.xs.SchemaDVFactoryImpl
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:14)
Test 3: false
java.lang.NoClassDefFoundError: Could not initialize class mf.org.apache.xerces.impl.dv.xs.SchemaDVFactoryImpl
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:17)
Test 4: false
[Loaded java.lang.Shutdown from shared objects file]
[Loaded java.lang.Shutdown$Lock from shared objects file]