Почему создание сервлетов в Eclipse нарушает мой web.xml? - PullRequest
7 голосов
/ 24 октября 2010

Будучи несколько ленивым, я был довольно счастлив, обнаружив, что могу создать новый исходный код сервлета, перейдя в New -> Servlet вместо перехода в New -> Class и затем отредактировав класс в сервлет.

Однако я обнаружил, что каждый раз, когда я создаю новый сервлет в Eclipse, Eclipse изменяет мой web.xml.

В частности, он изменяет верхний элемент на:

<web-app 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:javaee="http://java.sun.com/xml/ns/javaee" 
    xmlns:jsp="http://java.sun.com/xml/ns/javaee/jsp" 
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
        http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" 
    id="WebApp_ID" version="2.4">

(перевод строкимой.)

Это не обязательно плохо, но затем он изменяет различные подэлементы, помещая «javaee:» перед их именем, чтобы указать, что эти элементы принадлежат этому пространству имен.

Например, он меняет

<display-name>ShowLifecycles</display-name>

на

<javaee:display-name>ShowLifecycles</javaee:display-name>

После чего затем затмение жалуется на все элементы, которые он изменил, давая мне такие пометки, как:

cvc-complex-type.2.4.a: Invalid content was found starting with element 'javaee:display-name'. One of '{"http://
 java.sun.com/xml/ns/j2ee":description, "http://java.sun.com/xml/ns/j2ee":display-name, "http://java.sun.com/xml/ns/
 j2ee":icon, "http://java.sun.com/xml/ns/j2ee":distributable, "http://java.sun.com/xml/ns/j2ee":context-param, "http://
 java.sun.com/xml/ns/j2ee":filter, "http://java.sun.com/xml/ns/j2ee":filter-mapping, "http://java.sun.com/xml/ns/
 j2ee":listener, "http://java.sun.com/xml/ns/j2ee":servlet, "http://java.sun.com/xml/ns/j2ee":servlet-mapping, "http://
 java.sun.com/xml/ns/j2ee":session-config, "http://java.sun.com/xml/ns/j2ee":mime-mapping, "http://java.sun.com/xml/ns/
 j2ee":welcome-file-list, "http://java.sun.com/xml/ns/j2ee":error-page, "http://java.sun.com/xml/ns/j2ee":jsp-config, "http://
 java.sun.com/xml/ns/j2ee":security-constraint, "http://java.sun.com/xml/ns/j2ee":login-config, "http://java.sun.com/xml/ns/
 j2ee":security-role, "http://java.sun.com/xml/ns/j2ee":env-entry, "http://java.sun.com/xml/ns/j2ee":ejb-ref, "http://
 java.sun.com/xml/ns/j2ee":ejb-local-ref, "http://java.sun.com/xml/ns/j2ee":service-ref, "http://java.sun.com/xml/ns/
 j2ee":resource-ref, "http://java.sun.com/xml/ns/j2ee":resource-env-ref, "http://java.sun.com/xml/ns/j2ee":message-
 destination-ref, "http://java.sun.com/xml/ns/j2ee":message-destination, "http://java.sun.com/xml/ns/j2ee":locale-
 encoding-mapping-list}' is expected.

Что еще хуже, когда я использую поиск и замену, чтобы удалить все в "javaee:", который засоряет файл, Eclipse по-прежнему жалуется на них, даже если их больше нет.Я должен скопировать и вставить весь оставшийся файл поверх себя, чтобы эти жалобы исчезли.

Я уверен, что Eclipse пытается быть полезной, ожидая некоторого желания или потребности в этом пространстве имен.Как я могу сделать одно из двух:

  1. Сделать так, чтобы оно перестало это делать?

  2. Воспользуйтесь преимуществами всего, что он пытается сделать,и заставить его работать на меня, а не против меня?

Ответы [ 4 ]

11 голосов
/ 24 октября 2010

Я никогда не видел этого раньше, но это указывает на то, что ваш проект Eclipse действительно испорчен.По крайней мере, объявление корня web.xml не имеет никакого смысла.Это похоже на сочетание спецификаций Servlet 2.4 и 2.5.Возможно, Eclipse сбивается с толку, потому что корневое пространство имен (xmlns) указывает на Servlet 2.4 (с j2ee URI), в то время как сам веб-проект установлен как Servlet 2.5 или новее (который должен использовать тот с * 1004).* URI).

Кроме того, когда ваш веб-проект во время создания установлен на Servlet 3.0, Eclipse сгенерирует по умолчанию no web.xml из-за новых аннотаций Servlet 3.0, таких как @WebServlet, @WebFilter и т. Д., Что делает web.xml лишним.Когда вы создаете новые сервлеты с помощью New> Servlet , Eclipse уже автоматически сгенерирует эти аннотации.Возможно, вы пытались создать web.xml самостоятельно, основываясь на дезинформации.

Я бы посоветовал сделать резервную копию некоторого кода, если необходимо, выбросить весь проект и создать новый с правильными настройками и неприкоснитесь к корневому объявлению web.xml.

Предполагая, что вы используете последнюю версию Eclipse, Helios SR1 для разработчиков Java EE, щелкните правой кнопкой мыши Eclipse Project Explorer , выберите New> DynamicВеб-проект и просто заполните имя проекта и оставьте все по умолчанию.Нажмите Далее до последнего шага, а затем установите флажок Создать дескриптор развертывания web.xml , чтобы Eclipse сгенерировал его.Объявление корня должно выглядеть следующим образом:

<web-app 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
    id="WebApp_ID" version="3.0">
1 голос
/ 05 августа 2016

Переместите «display-name» в качестве первого элемента в тег «servlet», ошибка проверки должна исчезнуть.

1 голос
/ 18 июня 2014

У меня была похожая проблема.Я перенес веб-приложение со старого Tomcat 6 / Java 6 на Tomcat 7 / Java 7. Я скопировал и вставил существующее тело web.xml в новый 3.0 web.xml.Все было хорошо, пока я не добавил сервлет с параметрами init-param, display-name, description и load-on-startup.Eclipse пометил эти параметры как поврежденные с помощью «недопустимого содержимого, найденного в ...».Благодаря stackoverflow, я обнаружил, что загрузка при запуске должна приходить после init-params, а только RTFM, насколько они знают.Мои другие параметры все еще были помечены как сломанные.Вот как выглядел заголовок web.xml, когда он был сломан:

<?xml version="1.0" encoding="UTF-8"?>
<web-app 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://java.sun.com/xml/ns/javaee" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">

Я изменил dtds на ns / j2ee и web-app_2_5.xsd, и Ecliupse перестал жаловаться.Но его 2014 год, и мы скоро перейдем к Tomcat 8.Поэтому я усердно копался и нашел документы для.В веб-приложении 3.0 параметры должны быть в следующем порядке:

  1. jee: descriptionGroup = любая комбинация из 3 параметров: описание, отображаемое имя, значок
  2. имя сервлета
  3. выбрал 1: класс сервлетов или jsp-файл
  4. n число init-параметров
  5. загрузка при запуске
  6. опции: включено, асинхронноподдерживаемый, run-as, security-role-ref, multipart-config

Как только я привел свои параметры в порядок, Eclipse был доволен ns / javaee и web-app_3_0.xsd.

0 голосов
/ 05 августа 2015

Убедитесь, что файл web.xml начинается с тега, за которым следует тег

<?xml version="1.0" encoding="UTF-8"?>

В моем случае у меня был тег DOCTYPE, и удаление тега DOCTYPE из web.xml устранило эту ошибку,

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" >

...