EJB模块测试用例初始化错误

时间:2012-02-19 19:18:54

标签: java netbeans junit glassfish ejb

我正在尝试在NetBeans 7.1下单元测试一个简单的EJBModule项目,但是我收到一个警告和一个初始化错误。我正在使用GlassFish 3.1.1版。我希望有人熟悉这类问题,可以就如何解决这个问题给我一些建议。

在项目一中,我们有一个这样的远程接口:

@Remote
public interface CredentialEJBRemote {

//Stuff     

}

然后在第二个项目中,我们正在实现这样的界面:

@Stateless
@LocalBean
public class CredentialEJB implements CredentialEJBRemote {

//@Override stuff 

}

最后在单元测试中我正在这样做:

private static EJBContainer ec = EJBContainer.createEJBContainer();
private static Context ctx = ec.getContext();
CredentialEJBRemote instance = (CredentialEJBRemote)ctx.lookup("java:global/classes/CredentialEJB");
//Do stuff with instance

当我运行单元测试时,我收到警告和错误。

警告是:

WARNING: multiple versions of ant detected in path for junit
jar:file:/C:/Program%20Files/NetBeans%207.1/java/ant/lib/ant.jar!/org/apache/tools/ant/Project.class
and  jar:file:/C:/Program%20Files/glassfish3.1.1/glassfish/modules/ant.jar!/org/apache/tools/ant/Project.class

在测试用例上跟随此错误:

Testcase: initializationError(trefliq.persistence.CredentialEJBTest):   Caused an ERROR
Absent Code attribute in method that is not native or abstract in class file javax/ejb/embeddable/EJBContainer
java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file javax/ejb/embeddable/EJBContainer
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(   
    at java.lang.ClassLoader.defineClass(ClassLoader.java:791) ClassLoader.java:791)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
    at java.lang.Class.getDeclaredFields0(Native Method)
    at java.lang.Class.privateGetDeclaredFields(Class.java:2308)
    at java.lang.Class.getDeclaredFields(Class.java:1760)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:525)

任何可能导致此问题的想法?

非常感谢。

1 个答案:

答案 0 :(得分:2)

此错误原因是在类路径上拥有Netbean的javaee-api-6.0.jar。这个jar不包含方法体,所以抛出了难以捉摸的,看似罕见的“缺席代码”错误。通过在GlassFish的modules文件夹中重命名Ant.jar来解决Ant.jar警告。 Netbean的Ant.jar是冲突的,因为它们是Ant的两个不同版本。