为什么Java在调用mxmlc时抛出IllegalAccessError?

时间:2011-12-12 05:57:40

标签: java flex mxml mxmlc

我从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)

2 个答案:

答案 0 :(得分:1)

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

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

修复是使用bootstrap类加载器作为flexSdkClassLoader的父代:

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

IllegalAccessError还会影响运行mxmlc任务的一些Ant用户。该案例的解决方法是通过fork =“true”将mxmlc任务作为单独的进程运行。

答案 1 :(得分:0)

My Case,当我的JRE版本为1.7时出现此错误,如果我将jre版本切换为1.5,则错误消失。