試してみた環境
こちらで試した動作環境です。
Java (Oracle)
java version "1.8.0_301"
Java(TM) SE Runtime Environment (build 1.8.0_301-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.301-b09, mixed mode)
Tomcat
Server version: Apache Tomcat/9.0.46
Server built: May 8 2021 17:35:52 UTC
Server number: 9.0.46.0
Eclipse IDE for Enterprise Java and Web Developers (includes Incubating components)
Version: 2021-06 (4.20.0)
Build id: 20210612-2011
エラーの発生
web-apiのバージョンを試してみた結果、xmlns=“http://java.sun.com/xml/ns/j2ee”
のときエラーが起きることがわかりました。起きないのは、xmlns="http://xmlns.jcp.org/xml/ns/javaee”
の3.1以降でした。
エラーが起きるバージョン
エラーが起きないバージョン
バージョン3.0からweb.xmlがオプションになりました。web.xmlのエラーに関係なくTomcatは起動してサーブレットは正常に動作します。
エラーの箇所と意味
Tomcatのweb.xmlパースには問題がなさそうです。org.apache.tomcat.util.descriptor.web.WebXmlParser
を確認しました。3.0と4.0を正しくパースします。
eclipseだけの問題ではないでしょうか。エラーが発生するのは<servlet><servlet-name>の閉じタグの箇所。メッセージの’web-app-servlet-name-uniqueness’はサーブレット名がweb-appを通して一意という制約。servlet-nameがsimple typeではないと言っています。serlvlet-nameはcomplexTypeと定義されているので解釈に苦しみます。xmlns=“http://java.sun.com/xml/ns/j2ee”
のときに発生するバグのような...。
対処法
そちらの実行環境制約が分からないのですが、現在のバージョンで、web-apiのバージョンを3.1以上にすればエラーは発生しません。
3.0(エラーあり)
xml
1<?xml version="1.0" encoding="UTF-8"?>
2<web-app xmlns="http://java.sun.com/xml/ns/javaee"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
5 http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
6 version="3.0">
7 <servlet>
8 <servlet-name>Hello</servlet-name> <!-- cvc-id.3: A field of identity constraint 'web-app-servlet-name-uniqueness' matched element 'web-app', but this element does not have a simple type. -->
9 <servlet-class>q355566.Hello</servlet-class>
10 </servlet>
11 <servlet-mapping>
12 <servlet-name>Hello</servlet-name>
13 <url-pattern>/Hello</url-pattern>
14 </servlet-mapping>
15</web-app>
4.0
xml
1<?xml version="1.0" encoding="UTF-8"?>
2<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
5 http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
6 version="4.0">
7 <servlet>
8 <servlet-name>Hello</servlet-name> <!-- cvc-id.3: A field of identity constraint 'web-app-servlet-name-uniqueness' matched element 'web-app', but this element does not have a simple type. -->
9 <servlet-class>q355566.Hello</servlet-class>
10 </servlet>
11 <servlet-mapping>
12 <servlet-name>Hello</servlet-name>
13 <url-pattern>/Hello</url-pattern>
14 </servlet-mapping>
15</web-app>
追記(eclipse設定)
eclipseの設定で、以下のいずれかの方法で、無効にできることを確認しました。
[pereference]->[XML (Wild Web Development)]->[検証及び解決]
- [検証を使用可能にする]のチェックを外す
- [検証を使用可能にする]をチェック、[スキーマ・ベースの検証を可能にする]を[なし]
eclipseプラグインの開発者ではないのでこれ以上調べません。もしもプロジェクトごとの設定で無効にできるならそちらを利用してください。