У меня есть веб-приложение 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-файла основного проекта.
Есть ли у кого-нибудь идеи, почему это происходит?