ClassNotFoundException oracle.i18n.util.LocaleMapper при сканировании TLD tomcat. ojdbc7 maven dep (переходный xmlparserv2-12.1.0.2.jar) вызывает эту ошибку

Я получаю сообщение об ошибке при запуске приложения spring-boot со встроенным tomcat (еще не пробовал с server tomcat).

java.lang.IllegalStateException: Tomcat 7 reflection failed
    at org.springframework.boot.context.embedded.tomcat.SkipPatternJarScanner.scan(SkipPatternJarScanner.java:77)
    at org.apache.catalina.startup.TldConfig.execute(TldConfig.java:271)
    at org.apache.catalina.startup.TldConfig.lifecycleEvent(TldConfig.java:590)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5522)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1571)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1561)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.reflect.InvocationTargetException: null
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.boot.context.embedded.tomcat.SkipPatternJarScanner.scan(SkipPatternJarScanner.java:73)
    ... 12 common frames omitted
Caused by: java.lang.NoClassDefFoundError: oracle/i18n/util/LocaleMapper
    at oracle.xml.parser.v2.XMLReader.setEncoding(XMLReader.java:980)
    at oracle.xml.parser.v2.XMLReader.checkXMLDecl(XMLReader.java:3284)
    at oracle.xml.parser.v2.XMLReader.pushXMLReader(XMLReader.java:570)
    at oracle.xml.parser.v2.XMLReader.pushXMLReader(XMLReader.java:274)
    at oracle.xml.parser.v2.XMLParser.parse(XMLParser.java:232)
    at org.apache.tomcat.util.digester.Digester.parse(Digester.java:1576)
    at org.apache.catalina.startup.TldConfig.tldScanStream(TldConfig.java:565)
    at org.apache.catalina.startup.TldConfig.tldScanJar(TldConfig.java:513)
    at org.apache.catalina.startup.TldConfig.access$200(TldConfig.java:61)
    at org.apache.catalina.startup.TldConfig$TldJarScannerCallback.scan(TldConfig.java:300)
    at org.apache.tomcat.util.scan.StandardJarScanner.process(StandardJarScanner.java:259)
    at org.apache.tomcat.util.scan.StandardJarScanner.scan(StandardJarScanner.java:221)
    ... 17 common frames omitted
Caused by: java.lang.ClassNotFoundException: oracle.i18n.util.LocaleMapper
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 29 common frames omitted

При дальнейшем рассмотрении выясняется, что предыдущая версия orai18n.jar зависела от ojdbc7 maven dep и содержала этот класс в версии 11.2.0.3, но более новый файл (12.1.0.2) его не содержит.


person coderatchet    schedule 05.07.2017    source источник


Ответы (5)


Это конфликт с xmlparserv2. Попробуй это :

    <dependency>
        <groupId>com.oracle.jdbc</groupId>
        <artifactId>ojdbc7</artifactId>
        <version>12.1.0.2</version>
        <exclusions>
            <exclusion>
                    <groupId>com.oracle.jdbc</groupId>
                    <artifactId>xmlparserv2</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
person Edouard Serri    schedule 11.09.2018

После долгих хлопот я нашел основную причину (изменить: на самом деле лучший ответ имеет более подходящую причину/решение, см. ответ Серри):

согласно этот комментарий об ошибке в spring-boot Oracle SaxParserFactory impl и реализации DocumentBuilderFactory (позже столкнувшиеся после решения первой) подбираются вместо имплементов xerces по умолчанию. Изменение реализации с использованием файлов META-INF/services/<class-name> решило проблему:

in my.jar:

введите здесь описание изображения

и каждый файл:

// javax.xml.parsers.DocumentBuilderFactory
com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl

// javax.xml.parsers.SAXParserFactory
com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl

Это приводит к тому, что каждый средство поиска служб разрешает реализацию xerces по умолчанию в стандартной библиотеке Java.

person coderatchet    schedule 05.07.2017
comment
Можно ли создать папку META-INF и папку services, если у меня ее нет в моем проекте Maven в папке ресурсов? Eclipse фактически создает его в исходной папке, если я пытаюсь создать его в папке ресурсов. 2) После создания двух файлов в папке services, должен ли я просто поместить то, что вы упомянули чуть ниже and each file? - person John; 25.10.2018
comment
Привет, Джон. Это должно быть хорошо, я сам использую intellij, но папка ресурса и исходного кода теоретически должна в любом случае оказаться в одной и той же структуре каталогов вместе с классами. Однако, сделав шаг назад, ответ @EdouardSerri, вероятно, является лучшим способом решить эту проблему в целом без необходимости создавать эти файлы. - person coderatchet; 26.10.2018
comment
Я отредактировал jar xmlparserv2 напрямую, и он работает как шарм, спасибо @coderatchet! - person dev-random; 31.07.2020

В моем случае у меня были установлены Oracle Jars в $CATALINA_HOME/lib, чтобы иметь возможность установить соединение JNDI DB в Tomcat, просто удалив xmlparserv2.jar из каталога $CATALINA_HOME/lib, чтобы решить проблему.

person nicordesigns    schedule 06.12.2018

Новое изменение для xdb вместо com.oracle.jdbc используйте: com.oracle.ojdbc.

<dependency>
     <groupId>com.oracle.ojdbc</groupId>
     <artifactId>xdb</artifactId>
     <version>19.3.0.0</version>
     <exclusions>
          <exclusion>
               <groupId>com.oracle.ojdbc</groupId>
               <artifactId>xmlparserv2</artifactId>
          </exclusion>
     </exclusions>
</dependency>
person nulay    schedule 11.10.2020

Причина проблемы, как сказал Серри, за исключением решения, данного Серри. Я думаю, что если вы используете IntelliJ IDEA в качестве инструмента кодирования, проверьте артефакты структуры проекта, чтобы удалить зависимость от xmlparserv2, это сработало для меня

Удалите конфликтующие зависимости

person Navven    schedule 20.01.2021