Несмотря на то, что commons-lang включен в pom, возникает исключение java.lang.NoSuchMethodError:org.apache.commons.lang.StringUtils.join

у меня есть следующее

String pattern = "\\b(" + StringUtils.join(mypattern, "|") + ")\\b";

и в pom.xml у меня есть зависимость для

<dependency>
    <groupId>commons-lang</groupId>
    <artifactId>commons-lang</artifactId>
    <version>2.6</version>
</dependency>

Однако, когда я выполняю, я получаю следующие ошибки, несмотря на наличие commons-lang

java.lang.NoSuchMethodError:org.apache.commons.lang.StringUtils.join (Ljava/util/Collection;Ljava/lang/String;)Ljava/lang/String;

Как я могу решить эту проблему?

Обновление 1

Содержание войны

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

Структура войны

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


person Jacob    schedule 28.01.2015    source источник
comment
Является ли jar в вашем пути к классам среды выполнения?   -  person Mureinik    schedule 28.01.2015
comment
@Mureinik Он упакован в файл войны с файлами jar приложений и развернут на сервере приложений, во время выполнения возникает исключение.   -  person Jacob    schedule 28.01.2015
comment
У вас есть старая (до 2.3) версия commons-lang в пути к классам?   -  person Mark Rotteveel    schedule 28.01.2015
comment
@MarkRotteveel У меня нет jar 2.3 commons-lang в моем пути к классам. Я включил макет военного файла в свой вопрос.   -  person Jacob    schedule 28.01.2015
comment
На самом деле это не макет — это просто список jar-файлов. Он не показывает, где они находятся внутри файла войны. А как насчет других мест на сервере - есть ли где-то более старая версия commons-lang, которая может вызывать проблему?   -  person Jon Skeet    schedule 28.01.2015
comment
Я сказал до 2.3, а также посмотрите на путь к классам самого сервера приложений, а не только вашей войны. Моя точка зрения была такова: StringUtils.join(Collection, String) был добавлен в 2.3, поэтому, если ваше приложение было скомпилировано с 2.3 или более поздней версией, но работает с 2.2 или более ранней, вы получите NoSuchMethodError   -  person Mark Rotteveel    schedule 28.01.2015
comment
@Polppan нет, нет. Вы показали только папки и файлы верхнего уровня в войне. Мы до сих пор не знаем, где находятся jar-файлы в файле war.   -  person JB Nizet    schedule 28.01.2015
comment
Похоже, что во время выполнения вашему приложению виден старый файл commons-.lang. Это может быть, например, версия контейнера, если не настроено правильное разделение путей к классам. Проверьте, есть ли где-нибудь еще jar commons-lang, который вы можете обновить.   -  person eckes    schedule 28.01.2015
comment
JAR-файлы @JBNizet находятся в папке WEB-INF--›lib.   -  person Jacob    schedule 28.01.2015
comment
Верно - это то, что я искал с самого начала. Ну что ж. У меня есть диагностический шаг, который вы могли бы использовать - ранее в своем коде распечатайте StringUtils.class.getClassLoader().getResource("org/apache/commons/lang/StringUtils.class") - это покажет вам, откуда загружается класс.   -  person Jon Skeet    schedule 28.01.2015
comment
@eckes На сервере weblogic есть com.bea.core.apache.commons.lang_2.1.0.jar, так что это должно быть причиной проблемы? Если да, то как не использовать серверную версию jar?   -  person Jacob    schedule 28.01.2015
comment
Примечание: JAR-файл servlet-api НЕ должен находиться в файле войны. Правильная версия API предоставляется weblogic. Отметьте эту зависимость как зависимость с предоставленной областью в файле pom.   -  person JB Nizet    schedule 28.01.2015
comment
Этот комментарий не отвечает, что произойдет, если вы напечатаете StringUtils.class.getClassLoader().getResource("org/apache/commons/lang/StringU‌​tils.class") - я бы ожидал com.bea.core.apache.commons.lange_2.1.0.jar для разных пакетов, но это может быть не так...   -  person Jon Skeet    schedule 28.01.2015
comment
@JonSkeet Следующее привело к null во время выполнения. log.info("class *** " + StringUtils.class.getClassLoader().getResource( "org/apache/commons/lang/StringU‌​‌​tils.class"));   -  person Jacob    schedule 28.01.2015
comment
@Polppan: Это странно. Я вообще этого не понимаю... хм.   -  person Jon Skeet    schedule 28.01.2015
comment
@JonSkeet com.bea.core.apache.commons.lange_2.1.0.jar содержит org\apache\commons\lang\StringUtils.class Так это виновник?   -  person Jacob    schedule 28.01.2015
comment
@Polppan: Да, вполне может быть. Где находится этот jar-файл? В идеальном мире он будет загружаться только загрузчиком классов, который не используется для вашего кода...   -  person Jon Skeet    schedule 28.01.2015
comment
@JonSkeet это в wls1036\modules   -  person Jacob    schedule 28.01.2015
comment
@Полпан: Хорошо. Тогда я не ожидал, что это станет проблемой, хотя я мало использовал Weblogic. Если вы можете подключить к нему отладчик, было бы полезно посмотреть на загрузчик классов, используемый для StringUtils.   -  person Jon Skeet    schedule 28.01.2015
comment
Я не знаю о структуре ClassLoader в WLS, но если мы предполагаем, что вы не можете это исправить, то вы можете либо использовать commons-lang 2.1 в своей компиляции (при условии, что вы не сможете использовать неработающие новые методы) или вы может дополнительно развернуть commons-lang3 (java6+) (у него есть собственный пакет, поэтому, надеюсь, он не будет конфликтовать).   -  person eckes    schedule 28.01.2015
comment
@eckes Вы хотите сказать, что в WLS обновите commons-lang jar до более новой версии? Если ОС, как мне это сделать?   -  person Jacob    schedule 29.01.2015
comment
@Polppan нет, я имею в виду, поскольку это похоже на официальную библиотеку WLS, и я думаю, что у вас нет разрешения на ее обновление, лучше попробуйте понизить версию lang2 или использовать lang3 в своем проекте)   -  person eckes    schedule 29.01.2015


Ответы (1)


  1. Убедитесь, что ошибка возникает в строке, которую вы опубликовали (проверьте полную трассировку стека).
  2. Убедитесь, что файл commons-lang.jar находится внутри файла war (папка /WEB-INF/lib/) и является той версией jar, которую вы ожидали.
  3. Проверьте, не загружается ли другой язык commons. Например, если вы выполняете развертывание в Tomcat, убедитесь, что в каталоге tomcat/lib нет другого commons-lang.
person ARIS    schedule 28.01.2015
comment
На сервере weblogic есть com.bea.core.apache.commons.lang_2.1.0.jar, так что это должно быть причиной проблемы? Если да, то как не использовать серверную версию jar? - person Jacob; 28.01.2015