JBoss Resteasy+Maven+Eclipse WTPの件

Mavenを使ってServletのようなJavaEE仕様を使う場合、pom.xmlに以下のdependencyを追加します。

<dependency>
  <groupId>javax</groupId>
  <artifactId>javaee-web-api</artifactId>
  <version>6.0</version>
  <scope>provided</scope>
</dependency>

たいていはTomcatやJettyなどのコンテナに載せると思うので、scopeはprovidedでOKです。

と、ここでJavaEE6のJAX-RS1.1を実装した、JBoss Resteasyを使う場合は注意が必要です。↓はResteasyのpom.xmlに書かれた依存関係ですが、ここにjaxrs-apiが含まれていて、javaee-web-apiのクラス定義と重複します

クラス定義は正しいのでコンパイルは通りますが、そのまま実行するとこんな例外が出ます。
Resteasyは、自前のjaxrs-apiじゃないとダメみたい。

java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file javax/ws/rs/ext/RuntimeDelegate
	at java.lang.ClassLoader.defineClass1(Native Method)
	at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
	at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
	at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
	at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
	at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:190)

コンテナにデプロイされたファイルを見てみると、scopeをprovidedにしたはずのjavaee-web-apiがいました。どうやらEclipseWTPがscopeを無視してすべての依存ライブラリをコピーしているから、のようです。

というわけで、とりあえずjavaee-web-apiをpomから削除すればいけます。ただし、JAX-RS以外のJavaEE APIコンパイル時に使用できなくなる。。。はず。