java.lang.NoSuchMethodError, когда метод определенно существует

У меня есть веб-приложение Java на основе Spring Framework, которое было построено в SpringSource Tool Suite («STS»), и локальная копия Apache Tomcat. У нас также есть внутренний производственный сервер, на котором снова работает Tomcat.

Когда я запускаю приложение на своей машине для разработки и выполняю определенное действие в веб-приложении, все работает правильно. Однако, когда я развертываю веб-приложение в Tomcat на сервере (с помощью файла war, созданного maven), и повторяю эти вышеупомянутые конкретные действия, я сталкиваюсь с неожиданным поведением. Когда я проверил файл журнала сервера tomcat, я обнаружил это ...

2011-11-16 19:36:45,090 [http-8280-Processor1] ERROR [attachments]  invoke - Servlet.service() for servlet attachments threw exception java.lang.NoSuchMethodError: net.wmfs.coalesce.aa.dao.MediaDao.updateAlfrescoNodeRef(Ljava/lang/Long;Ljava/lang/String;)V
at net.wmfs.coalesce.aa.service.impl.MediaServiceImpl.doFileUpload(MediaServiceImpl.java:102)
at net.wmfs.coalesce.aa.servlet.MediaServlet.doFileUpload(MediaServlet.java:83)
at net.wmfs.coalesce.aa.servlet.MediaServlet.doPost(MediaServlet.java:55)

Теперь метод updateAlfrescoNodeRef определенно существует в классе MediaDao - иначе мой код не скомпилировался бы в STS ...

package net.wmfs.coalesce.aa.dao;

public class MediaDao extends JdbcDaoSupport {

    public void updateAlfrescoNodeRef(final Long recordId, final String nodeRef) {
        // java code
    }
}

Как видите, подпись метода верна.

Я подозревал, что при создании файла войны maven могла возникнуть проблема, поэтому я извлек содержимое файлов войны. В папке WEB-INF / lib я нашел файл jar, содержащий класс MediaDao, и извлек его содержимое. Затем я сделал ...

cat ./MediaDao.class

Теперь, поскольку файлы классов являются двоичными, я в основном видел gobledegook. Однако я смог четко разглядеть ссылки на метод updateAlfrescoNodeRef, а также содержимое String в этом методе. Значит, метод определенно существует.

Конфигурация bean-компонента в XML-файлах среды Spring определенно верна, иначе код не запускался бы, когда я выполнял его на своей машине разработки.

Поиск в Google предложил конфликт библиотек на сервере, но все упомянутые классы - MediaServlet, MediaServiceImpl, MediaDao - находятся в основном проекте (тот, в котором есть папка WEB-INF). Хотя вполне возможно, что на сервере может быть несколько копий зависимостей, определенно существует только одна копия jar-файла основного проекта.

Есть ли у кого-нибудь идеи, почему это происходит?

6
задан Benjamin 20 December 2013 в 00:36
поделиться