我使用GlassFish 4 web配置文件,我有以下界面和类。
@Local
public interface SomeService {
...
}
@Singleton
public class SomeServiceBean implements SomeService {
...
}
当我将接口和类放在.war存档(即在domain1 / autodeplay中)时,一切正常。但是,当我将接口和类放在单独的.jar存档(即在domain1 / lib中),然后部署war应用程序时,我得到:
java.lang.RuntimeException: Cannot resolve reference Local ejb-ref name=com.temp.MyServlet/someService,Local 3.x interface =com.temp.SomeService,ejb-link=null,lookup=,mappedName=,jndi-name=,refType=Session
at com.sun.enterprise.deployment.util.ComponentValidator.accept(ComponentValidator.java:374) ~[dol.jar:na]
at com.sun.enterprise.deployment.util.DefaultDOLVisitor.accept(DefaultDOLVisitor.java:78) ~[dol.jar:na]
at com.sun.enterprise.deployment.util.ComponentValidator.accept(ComponentValidator.java:123) ~[dol.jar:na]
at com.sun.enterprise.deployment.util.ApplicationValidator.accept(ApplicationValidator.java:152) ~[dol.jar:n
...
我不使用任何xml描述符。那么,是否可以在domain1 / lib中使用EJB,如果可以,如何让EJB容器找到它们?附:我试过GF 4全 - 结果是一样的。
答案 0 :(得分:1)
EJB无法作为库添加到GlassFish,库只是添加到类路径中,并且它们上的任何注释都会被忽略,并且它们不会通过EJB容器。如果您确实希望将EJB作为单独的JAR,则可以像WAR或EAR文件一样部署它们。
在add-library
命令的Glassfish reference manual中,它表示它"将库添加到类加载器目录",而对于deploy
命令,它表示"应用程序可以是... EJB模块"。
另外,通过查看Glassfish的source code,可以确定所有库在启动时(参见here和here)或者在applibs中添加到Classloader中然后在部署应用程序时(参见here)。