Почему Java вызывает IllegalAccessError при вызове mxmlc? - PullRequest
0 голосов
/ 12 декабря 2011

Я вызываю компилятор Flex mxmlc из приложения Java.После добавления парсера Xerces в classpath проекта я получаю сообщение об ошибке ниже.

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 ]

1 голос
/ 12 декабря 2011

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 также влияет на некоторых пользователей Ant, выполняющих задачу mxmlc.Обходной путь для этого случая - запустить задачу mxmlc как отдельный процесс с помощью fork = "true".

0 голосов
/ 12 сентября 2014

Мой случай, я получил эту ошибку, когда моя версия JRE 1.7, ошибка исчезнет, ​​если я переключу свою версию jre на 1.5.

...