我为 JAX-RS 编写了一个补充,并将 Java EE 6 API 作为 Maven 依赖项包含在内。
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>6.0</version>
<scope>provided</scope>
</dependency>
然后我有一个小测试用例:
@Test
public void testIsWriteable() {
class SpecialViewable extends Viewable {
public SpecialViewable() {
super("test");
}
}
FreeMarkerViewProcessor processor = new FreeMarkerViewProcessor(null);
assertTrue(processor.isWriteable(SpecialViewable.class, null, null,
MediaType.WILDCARD_TYPE));
}
但我收到一个错误:
java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file javax/ws/rs/core/MediaType
...
如果我将 Jersey 作为 JAX-RS 实现而不是 Java EE API 包含在内,一切都很好。
感谢 BalusC 的提示,我知道了我的猜测:Java EE 6 只是一个没有方法体的 API:来自 java.net 博客 http://weblogs.java.net/blog/ludo/archive/2007/01/java_ee_5_apis.html
你可以用这个编译你的代码
jar,但当然你不能运行
您的应用程序,因为它
仅包含 Java EE 5 API 和
不包含任何方法体。如果
你尝试跑步,你会得到这个
例外:
线程“main”中的异常
java.lang.ClassFormatError:不存在
方法中的代码属性不是
类文件中的本机或抽象
javax/邮件/会话
为了执行 Java EE 5
应用程序,您仍然需要 Java
EE 5 容器,例如
GlassFish 应用服务器。
我尝试添加泽西岛test
范围,但没有用。
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>6.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-server</artifactId>
<version>${jersey-version}</version>
<scope>test</scope>
</dependency>
如何测试仅依赖于官方 Java EE API 的软件?
Solution
需要放置提供商(Jersey)beforepom.xml 中的 API (javeee-api)。
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-server</artifactId>
<version>${jersey-version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>6.0</version>
<scope>provided</scope>
</dependency>