为什么在Eclipse中创建Servlet会破坏我的web.xml?

Bri*_*ler 7 java eclipse web.xml servlets xml-namespaces

有点懒,我很高兴发现我可以通过New - > Servlet来创建一个新的servlet源代码,而不是去New - > Class然后将类编辑成一个servlet.

但是,我发现每次在Eclipse中创建一个新的servlet时,Eclipse都会修改我的web.xml.

具体来说,它将top元素修改为:

<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">
Run Code Online (Sandbox Code Playgroud)

(我的线路爆炸.)

这似乎并不一定是坏事,但它通过在其名称前面加上"javaee:"来修改各种子元素,以指示这些元素属于该命名空间.

例如,它会改变

<display-name>ShowLifecycles</display-name>
Run Code Online (Sandbox Code Playgroud)

<javaee:display-name>ShowLifecycles</javaee:display-name>
Run Code Online (Sandbox Code Playgroud)

之后,eclipse会抱怨它修改的所有元素,给我一些符号:

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.
Run Code Online (Sandbox Code Playgroud)

更糟糕的是,当我使用find和replace将所有内容删除到"javaee:"中时,Eclipse仍会抱怨这些文件,即使它们不再存在.我必须将整个剩余文件复制并粘贴到自身之上,以避免这些投诉.

我确信Eclipse正在努力发挥作用,期待这个命名空间的一些愿望或需求.我怎样才能做以下两件事之一:

  1. 让它停止这样做?

  2. 利用它想做的任何事情,让它对我有用而不是对我不利?

Bal*_*usC 11

我以前从未见过这个,但这表明你的Eclipse项目真的搞砸了.至少web.xml根声明没有任何意义.它看起来像Servlet 2.4和2.5规范的混合.也许Eclipse会变得混乱,因为root namespace(xmlns)指向Servlet 2.4(带有j2eeURI),而web项目本身被设置为Servlet 2.5或更新(应该使用带有javaeeURI的那个).

此外,当你的Web项目设置为Servlet的创建期间3.0,默认情况下没有web.xml将Eclipse的,因为新的Servlet 3.0批注等而产生的@WebServlet,@WebFilter等等.这使得web.xml多余的.当您通过New> Servlet创建新的servlet时,Eclipse将自动生成这些注释.可能你试图web.xml根据错误的信息来创造自己.

我建议在必要时备份一些代码,抛弃整个项目并使用适当的设置创建一个新项目,不要触及web.xml根声明.

假设您正在使用最新的Eclipse版本,Helios SR1 for Java EE开发人员,右键单击Eclipse的Project Explorer,选择New> Dynamic Web Project并填充项目名称并保持默认值.单击Next直到最后一步,然后选中Generate web.xml deployment descriptor复选框以让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">
Run Code Online (Sandbox Code Playgroud)