Ответ 1
Это оказалось глупой ошибкой. Мой log4j не был настроен для сбора моего вывода ошибки. Я выбрасывал ошибки конфигурации в фоновом режиме, и как только я исправил те, что мне было хорошо, и мои сопоставления запросов работали нормально.
Мой проект Eclipse внезапно перестает корректно развертываться. Я не могу отследить его до каких-либо конкретных изменений, которые я внес в среду.
Я тестировал несколько проектов с контролируемым источником, и все они ведут себя одинаково:
May 01, 2013 12:00:45 PM org.apache.catalina.core.AprLifecycleListener init
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Program Files (x86)\Java\jdk1.7.0_11\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows \System32\WindowsPowerShell\v1.0\;.
May 01, 2013 12:00:45 PM org.apache.tomcat.util.digester.SetPropertiesRule begin
WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:fismacm' did not find a matching property.
May 01, 2013 12:00:45 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-bio-8080"]
May 01, 2013 12:00:45 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["ajp-bio-8009"]
May 01, 2013 12:00:45 PM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 296 ms
May 01, 2013 12:00:45 PM org.apache.catalina.core.StandardService startInternal
INFO: Starting service Catalina
May 01, 2013 12:00:45 PM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/7.0.35
May 01, 2013 12:00:46 PM org.apache.catalina.core.ApplicationContext log
INFO: No Spring WebApplicationInitializer types detected on classpath
May 01, 2013 12:00:48 PM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://java.sun.com/jstl/core is already defined
May 01, 2013 12:00:48 PM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://java.sun.com/jstl/sql_rt is already defined
May 01, 2013 12:00:48 PM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://java.sun.com/jsp/jstl/sql is already defined
May 01, 2013 12:00:48 PM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://java.sun.com/jstl/core_rt is already defined
May 01, 2013 12:00:48 PM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://java.sun.com/jsp/jstl/core is already defined
May 01, 2013 12:00:48 PM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://java.sun.com/jsp/jstl/functions is already defined
May 01, 2013 12:00:48 PM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://java.sun.com/jstl/fmt is already defined
May 01, 2013 12:00:48 PM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://jakarta.apache.org/taglibs/standard/permittedTaglibs is already defined
May 01, 2013 12:00:48 PM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://java.sun.com/jstl/xml is already defined
May 01, 2013 12:00:48 PM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://jakarta.apache.org/taglibs/standard/scriptfree is already defined
May 01, 2013 12:00:48 PM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://java.sun.com/jstl/fmt_rt is already defined
May 01, 2013 12:00:48 PM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://java.sun.com/jsp/jstl/fmt is already defined
May 01, 2013 12:00:48 PM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://java.sun.com/jsp/jstl/xml is already defined
May 01, 2013 12:00:48 PM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://java.sun.com/jstl/xml_rt is already defined
May 01, 2013 12:00:48 PM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://java.sun.com/jstl/sql is already defined
May 01, 2013 12:00:48 PM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://www.springframework.org/tags/form is already defined
May 01, 2013 12:00:48 PM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://www.springframework.org/tags is already defined
May 01, 2013 12:00:48 PM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://www.springframework.org/security/tags is already defined
May 01, 2013 12:00:48 PM org.apache.catalina.core.ApplicationContext log
INFO: No Spring WebApplicationInitializer types detected on classpath
May 01, 2013 12:00:48 PM org.apache.catalina.core.ApplicationContext log
INFO: No Spring WebApplicationInitializer types detected on classpath
May 01, 2013 12:00:48 PM org.apache.catalina.core.ApplicationContext log
INFO: Set web app root system property: 'webapp.root' = [X:\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\fismacm\]
May 01, 2013 12:00:48 PM org.apache.catalina.core.ApplicationContext log
INFO: Initializing log4j from [X:\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\fismacm\WEB- INF\log4j.properties]
May 01, 2013 12:00:48 PM org.apache.catalina.core.ApplicationContext log
INFO: Initializing Spring root WebApplicationContext
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
May 01, 2013 12:00:49 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-bio-8080"]
May 01, 2013 12:00:49 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["ajp-bio-8009"]
May 01, 2013 12:00:49 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 3898 ms
Это похоже на ключевой компонент: INFO: No Spring Типы WebApplicationInitializer, обнаруженные в пути к классам.
Я пробовал очистить проекты, переопределить серверы и даже создать целые новые рабочие пространства. Я явно пропустил отметку.
Любые советы по его очистке будут очень благодарны.
Это оказалось глупой ошибкой. Мой log4j не был настроен для сбора моего вывода ошибки. Я выбрасывал ошибки конфигурации в фоновом режиме, и как только я исправил те, что мне было хорошо, и мои сопоставления запросов работали нормально.
Я потратил часы на это, и решение было:
Остерегайтесь, если вы используете Maven. Структура вашей папки должна быть правильной.
При использовании Maven каталог WEB-INF должен находиться внутри webapp:
src/main/webapp/WEB-INF
INFO: Нет Spring Типы WebApplicationInitializer, обнаруженные в пути к классам.
Может также отображаться, если вы используете Maven с Eclipse и развертываете свою WAR,
(Eclipse, Kepler, с M2)
(щелкните правой кнопкой мыши по вашему проекту) → Запустить как → Запустить на сервере
До создания и удаления папки m2e-wtp .
Убедитесь, что отмечен Архив файлов Maven, созданный в каталоге сборки.
В разделе: "Окно → настройки → Maven → Интеграция Java EE"
Тогда:
Используйте M2, чтобы выполнить сборку, то есть обычный пакет Clean → или Install и т.д.
Если "Project → Build Automatically" не выбрано. Вы можете принудительно создать генерацию "m2e-wtp folder and contents",
" (щелкните правой кнопкой мыши по вашему проекту) → Maven → Обновить проект..."
Примечание. Убедитесь, что опция "Чистые проекты" не выбрана. В противном случае содержимое целевых/классов будет удалено, и вы вернетесь к квадрату.
Кроме того, когда;
" Project → Build Automatically" выбрано создание "m2e-wtp folder and contents"
или " Проект → Построить все"
или " (щелкните правой кнопкой мыши по проекту) → Build Project
WebApplicationInitializer - это интерфейс, который можно реализовать в одном из ваших классов. При запуске Spring выполняется сканирование для этих классов, если вы используете сервлет spec 3 и имеете атрибут metadata-complete = "false" в вашем web.xml. Но это не проблема. Единственной ошибкой, которую я могу выяснить, является отсутствие slf4j-log4j12.jar.
У меня также была та же проблема. У моего maven был плагин tomcat7, но среда JRE была 1.6. Я изменил свой tomcat7 на tomcat6, и ошибка исчезла.
xml не был в папке WEB-INF, вот почему я получал эту ошибку, убедитесь, что web.xml и xxx-servlet.xml находятся в папке WEB_INF, а не в папке webapp.
У меня была глупая ошибка, мне потребовалось смущающе долго решать... Проверьте мой pom.xml...
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.outbottle</groupId>
<artifactId>PersonalDetailsMVC</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>PersonalDetailsMVC</name>
<properties>
<endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.version>4.0.1.RELEASE</spring.version>
<jstl.version>1.2</jstl.version>
<javax.servlet.version>3.0.1</javax.servlet.version>
</properties>
<dependencies>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>${javax.servlet.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>${jstl.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<compilerArguments>
<endorseddirs>${endorsed.dir}</endorseddirs>
</compilerArguments>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.3</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<phase>validate</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<outputDirectory>${endorsed.dir}</outputDirectory>
<silent>true</silent>
<artifactItems>
<artifactItem>
<groupId>javax</groupId>
<artifactId>javaee-endorsed-api</artifactId>
<version>7.0</version>
<type>jar</type>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
Проблема была в имени моего пакета. Он ДОЛЖЕН быть "com.outbottle" (затем config/controllerlers/model/etc), чтобы он работал. Как вы можете видеть выше, я использовал Maven (впервые), Spring, 1,8 JDK и почти имел отладку, отлаживающую эту проблему. Все работает на Glassfish (Tomcat тоже подходит для вышеупомянутой конфигурации pom). Тем не менее, я сейчас доволен собой и знаю Maven и Spring намного лучше для следующего шага кривой обучения Spring. Надеюсь, это тоже поможет!
STS имеет папку метаданных в своей рабочей области. Вы увидите фактическую ошибку в файле .log под C:\Users\firstname.lastname\Documents\рабочее пространство-ВТР-3.9.2.RELEASE.metadata
Tomcat обычно не добавляет классы в src/test/java
в путь к классам. Они отсутствуют, если вы запускаете tomcat в области проверки. Чтобы приказать tomcat соблюдать классы в тесте, используйте -Dmaven.tomcat.useTestClasspath=true
или добавьте
<properties>
<maven.tomcat.useTestClasspath>true</maven.tomcat.useTestClasspath>
</properties>
К твоему pom.xml
.
Я провел весь день сегодня, исследуя эту проблему, и ни один из ответов не помог. Вот мой сценарий. Типы WebApplicationInitializer в моем случае находятся внутри jar файлов. у нас есть многомодульный веб-проект gradle, где каждый модуль упакован в виде jar файла и включен в веб-артефакт. Проблема заключается в том, что загрузчик классов Apache tomcat не ищет реализации WebApplicationIntializer в WEB-INF/lib, а ищет эти типы непосредственно в папке WEB-INF/classes.
Вот что я сделал для всех, кто столкнется с этой проблемой в будущем.
Я сам реализовал ServletContainerInitializer и добавил это имя класса в META-INF/services/javax.servlet.ServletContainerInitializer
.В этой реализации я скопировал код из SpringServletContainerIntializer и использовал отражения, чтобы найти классы, реализующие интерфейс CustomWebApplicationInitializer. Я не использовал весенний интерфейс WebApplicationInitializer, чтобы избежать каких-либо конфликтов. В основном у меня тот же контракт, что и у WebApplicationInitializer с другим именем. Теперь при запуске вызывается мой инициализатор контейнера, и я делегировал вызов всем моим CustomWebApplicationInitializer.
Основываясь на результатах поиска, я также обнаружил, что загрузчик, используемый для tomcat, можно обновить, чтобы он осуществлял поиск в WEB-INF/lib, но у меня мало контроля над томкатом, на котором я развернул свое приложение, поэтому я воспользовался приведенным выше решением. Надеюсь, это кому-нибудь поможет.