2011-12-12 27 views
0

我從Java應用程序中調用Flex mxmlc編譯器。將Xerces解析器添加到項目類路徑後,我得到下面的錯誤。爲什麼Java在調用mxmlc時拋出IllegalAccessError?

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) 
+0

你說你在類路徑上有Xerces。那麼所有其他的依賴關係呢? – RIAstar

回答

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的任務,一些螞蟻的用戶。這種情況下的解決方法是通過fork =「true」作爲單獨的進程運行mxmlc任務。

+1

我正在使用ant 1.7版本。當我轉移到ant 1.9版本時,錯誤消失了。 Ant 1.9沒有xercesImpl.jar。 – Champ

0

我的情況,當我的JRE版本是1.7時出現這個錯誤,如果我將我的jre版本切換到1.5,錯誤消失。

相關問題