Статьи

Исключение для Spring 3 и Apache Commons JCS

Я видел несколько проектов за последние несколько месяцев, которые должны были кэшировать данные между запросами. Разработчики, не желая писать свой собственный модуль кеширования, решили, что Apache Commons JCS отвечает всем требованиям, и добавили его в POM Maven, используя последнюю версию:

<dependency>
    <groupId>jcs</groupId>
    <artifactId>jcs</artifactId>
    <version>1.3</version>
</dependency>  

К сожалению, при запуске сборки возникли исключения со следующими основными причинами:

Caused by: javax.xml.parsers.ParserConfigurationException: Unable to validate using XSD: 
Your JAXP provider [org.apache.xerces.jaxp.DocumentBuilderFactoryImpl@8034b6] does not support XML Schema. 
Are you running on Java 1.4 with Apache Crimson? Upgrade to Apache Xerces (or Java 1.5) for full XSD support.

Caused by: java.lang.IllegalArgumentException: No attributes are implemented

… начали появляться похожие на показанные в примере ниже:

Tests run: 5, Failures: 0, Errors: 4, Skipped: 1, Time elapsed: 0.303 sec <<< FAILURE!
testSendFileStringOutputStream(com.configureconnect.cplayer.ImageGeneratorServiceTest)  Time elapsed: 0.105 sec  <<< ERROR!
org.unitils.core.UnitilsException: Unable to create application context for locations [test-beans.xml]
 at org.unitils.spring.util.ApplicationContextManager.createInstanceForValues(ApplicationContextManager.java:121)
 at org.unitils.spring.util.ApplicationContextManager.createInstanceForValues(ApplicationContextManager.java:36)
 at org.unitils.core.util.AnnotatedInstanceManager.getInstanceImpl(AnnotatedInstanceManager.java:234)
 at org.unitils.core.util.AnnotatedInstanceManager.getInstance(AnnotatedInstanceManager.java:121)
 at org.unitils.spring.util.ApplicationContextManager.getApplicationContext(ApplicationContextManager.java:65)
 at org.unitils.spring.SpringModule.getApplicationContext(SpringModule.java:222)
 at org.unitils.spring.SpringModule$1.isApplicableFor(SpringModule.java:104)
 at 

---- Lots of lines removed for readability....

 at org.apache.maven.surefire.Surefire.run(Surefire.java:169)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 at java.lang.reflect.Method.invoke(Method.java:592)
 at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:350)
 at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:1021)
Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: Parser configuration exception parsing XML from class path resource [test-beans.xml]; nested exception is javax.xml.parsers.ParserConfigurationException: Unable to validate using XSD: Your JAXP provider [org.apache.xerces.jaxp.DocumentBuilderFactoryImpl@8034b6] does not support XML Schema. Are you running on Java 1.4 with Apache Crimson? Upgrade to Apache Xerces (or Java 1.5) for full XSD support.
 at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:404)
 at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334)
 at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302)
 at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:143)
 at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:178)
 at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:149)
 at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:212)
 at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:126)
 at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:92)
 at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:130)
 at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:467)
 at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:397)
 at org.unitils.spring.util.ApplicationContextManager.createInstanceForValues(ApplicationContextManager.java:117)
 ... 32 more
Caused by: javax.xml.parsers.ParserConfigurationException: Unable to validate using XSD: Your JAXP provider [org.apache.xerces.jaxp.DocumentBuilderFactoryImpl@8034b6] does not support XML Schema. Are you running on Java 1.4 with Apache Crimson? Upgrade to Apache Xerces (or Java 1.5) for full XSD support.
 at org.springframework.beans.factory.xml.DefaultDocumentLoader.createDocumentBuilderFactory(DefaultDocumentLoader.java:102)
 at org.springframework.beans.factory.xml.DefaultDocumentLoader.loadDocument(DefaultDocumentLoader.java:70)
 at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:388)
 ... 44 more
Caused by: java.lang.IllegalArgumentException: No attributes are implemented
 at org.apache.xerces.jaxp.DocumentBuilderFactoryImpl.setAttribute(DocumentBuilderFactoryImpl.java:98)
 at org.springframework.beans.factory.xml.DefaultDocumentLoader.createDocumentBuilderFactory(DefaultDocumentLoader.java:99)
 ... 46 more

Исходя из трассировки стека, я полагаю, что именно зависимость JCS от xerces и других API XML вызвала проблему.

Классы из этих библиотек были добавлены в Java SE SDK и усовершенствованы, в то время как xerces также продолжает расти, изменяться и расходиться. Следовательно, при компиляции с Java 5 и выше классы xerces конфликтуют с Java SE SDK, создавая исключение, продемонстрированное выше.

Возможные решения

  • Не используйте JCS: это работает!
  • Попробуйте исключить xerces, используя Maven. Я еще не пробовал это …
  • Обновление до весны 3.1

Используемая версия Spring была 3.0.5, но ребята из Spring были заняты и недавно выпустили Spring 3.1, которая поставляется с собственным кешем. Я еще не смотрел на это, но стоит исследовать …

 

С http://www.captaindebug.com/2012/01/spring-3-and-apache-commons-jcs.html