【问题标题】:Why does Java to throw IllegalAccessError when invoking mxmlc?为什么 Java 在调用 mxmlc 时会抛出 IllegalAccessError?
【发布时间】:2011-12-12 05:57:40
【问题描述】:

我从 Java 应用程序调用 Flex mxmlc 编译器。将 Xerces 解析器添加到项目类路径后,出现以下错误。

java.lang.IllegalAccessError: class org.apache.xerces.util.XMLAttributesMMImpl$AttributeMMImpl cannot access its superclass org.apache.xerces.util.XMLAttributesImpl$Attribute
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
    at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    at org.apache.xerces.impl.XMLDocumentFragmentScannerMMImpl.<init>(XMLDocumentFragmentScannerMMImpl.java:254)
    at org.apache.xerces.impl.XMLDocumentScannerMMImpl.<init>(XMLDocumentScannerMMImpl.java:238)
    at org.apache.xerces.impl.XMLNSDocumentScannerMMImpl.<init>(XMLNSDocumentScannerMMImpl.java:75)
    at org.apache.xerces.parsers.XML11ConfigurationMMImpl.<init>(XML11ConfigurationMMImpl.java:562)
    at org.apache.xerces.parsers.XML11ConfigurationMMImpl.<init>(XML11ConfigurationMMImpl.java:409)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at java.lang.Class.newInstance0(Class.java:355)
    at java.lang.Class.newInstance(Class.java:308)
    at org.apache.xerces.parsers.ObjectFactory.newInstance(Unknown Source)
    at org.apache.xerces.parsers.ObjectFactory.findJarServiceProvider(Unknown Source)
    at org.apache.xerces.parsers.ObjectFactory.createObject(Unknown Source)
    at org.apache.xerces.parsers.ObjectFactory.createObject(Unknown Source)
    at org.apache.xerces.parsers.SAXParser.<init>(Unknown Source)
    at org.apache.xerces.parsers.SAXParser.<init>(Unknown Source)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at java.lang.Class.newInstance0(Class.java:355)
    at java.lang.Class.newInstance(Class.java:308)
    at org.xml.sax.helpers.NewInstance.newInstance(NewInstance.java:51)
    at org.xml.sax.helpers.XMLReaderFactory.loadClass(XMLReaderFactory.java:187)
    at org.xml.sax.helpers.XMLReaderFactory.createXMLReader(XMLReaderFactory.java:180)
    at org.jdom.input.SAXBuilder.createParser(SAXBuilder.java:641)
    at org.jdom.input.SAXBuilder.build(SAXBuilder.java:489)
    at org.jdom.input.SAXBuilder.build(SAXBuilder.java:865)

【问题讨论】:

  • 你说你在类路径上有 Xerces。那么所有其他依赖项呢?

标签: java apache-flex mxml mxmlc


【解决方案1】:

Flex SDK 包含一个定制版本的 Xerces 解析器 (lib/xercesPatch.jar)。自定义类都以 MM 结尾(对于 Macromedia)。 AFAICT,解析器被定制为将行号与解析的属性相关联。

在我的情况下,问题是由于将应用程序类加载器设置为处理 Flex SDK 库的类加载器的父级引起的。我在应用程序类路径中有 Xerces; Xerces 也在 Flex SDK 类路径中。 MM 解析器类由 flexSdkClassLoader 加载,因为它们是唯一命名的。但是,应用程序类加载器正在找到解析器基类(可能它们已经加载了)。

修复是使用引导类加载器作为 flexSdkClassLoader 的父级:

List<URL> flexSdkJars = ...; 
URLClassLoader flexSdkClassLoader = new URLClassLoader(flexSdkJars.toArray(new URL[flexSdkJars.size()]), String.class.getClassLoader());

IllegalAccessError 也会影响一些运行 mxmlc 任务的 Ant 用户。这种情况的解决方法是通过 fork="true" 将 mxmlc 任务作为单独的进程运行。

【讨论】:

  • 我使用的是 ant 1.7 版本。当我移至 ant 1.9 版本时,该错误消失了。 Ant 1.9 没有 xercesImpl.jar。
【解决方案2】:

我的情况,当我的 JRE 版本是 1.7 时出现此错误,如果我将 jre 版本切换到 1.5,该错误就会消失。

【讨论】:

    猜你喜欢
    • 2012-07-03
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    • 2015-06-24
    • 2021-06-18
    • 1970-01-01
    相关资源
    最近更新 更多