针对Java EE 6 API进行testing

我为JAX-RS编写了一个补充,并将Java EE 6 API作为Maven依赖包含在内。

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

然后我有一个小testing用例:

  @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博客

你可以用这个jar来编译你的代码,但是当然你不能用它来运行你的应用程序,因为它只包含Java EE 5 API,并且不包含任何方法体。 如果你尝试运行,你会得到这个exception:

线程“main”中的exceptionjava.lang.ClassFormatError:在类文件中非本地或抽象的方法中的缺省代码属性javax / mail / Session

为了执行Java EE 5应用程序,您仍然需要Java EE 5容器,例如GlassFish应用程序服务器。

我试图添加与test范围Jersy,但它没有工作。

 <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> 

我如何testing仅依赖官方Java EE API的软件?

提供者(Jersey)需要放在pom.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> 

不确定这会解决您的问题,但GlassFish Embedded提供了Java EE 6实现。 将此添加到您的pom.xml

 <project> ... <repositories> <repository> <id>glassfish-extras-repository</id> <url>http://download.java.net/maven/glassfish/org/glassfish/extras</url> </repository> </repositories> ... <dependencies> <dependency> <groupId>org.glassfish.extras</groupId> <artifactId>glassfish-embedded-all</artifactId> <version>3.0.1</version> <scope>test</scope> </dependency> <dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version>6.0</version> <scope>provided</scope> </dependency> ... </dependencies> ... </project> 

javaee-api 之前声明glassfish-embedded-all artifact是非常重要的。

至于我,JBoss的实现比整个Glassfish小,所以我使用:

  <dependency> <groupId>org.jboss.spec</groupId> <artifactId>jboss-javaee-6.0</artifactId> <version>${version.jboss-javaee-6.0}</version> <type>pom</type> </dependency> 

<scope>test</scope>也不会造成任何损害。

JSR提供者不可知论的另一种select是

 <dependency> <groupId>javax.ws.rs</groupId> <artifactId>jsr311-api</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version>6.0</version> <scope>provided</scope> </dependency> 

这使您可以将Jersey与另一个提供商交换。 对于Glassfish 3.1.2, 它使用jersey-server 1.11 ,根据jerseypom使用jsr311版本1.1。