Glassfish 3.0:部署ejb模块时出现exception……无效的ejb j ar:它包含零ejb

我有一个非常简单的ejb 3.0模块与maven,它只有两个会话bean一个无状态,另一个是单例…当我尝试在Glassfish 3.0服务器上部署项目时,我得到了这个例外:

部署期间发生错误:部署应用程序时出现exception:无效的ejb jar:它包含零ejb。 注意:1。有效的ejb jar至少需要一个会话,实体(1.x / 2.x样式)或消息驱动的bean。 2. EJB3 +实体bean(@Entity)是POJO,请将它们打包为库jar。 3.如果jar文件包含使用EJB组件级别注释(@Stateless,@ Stateful,@ MessageDriven,@ Singleton)注释的有效EJB,请检查server.log以查看注释是否已正确处理..请参阅服务器。记录更多详细信息。

我使用Glassfish Verifier工具validation项目,我得到了这个例外,但我不知道该怎么办?

Verifier output unparsable Verifier output (C:\Users\Mariam.Moustafa\Documents\NetBeansProjects\web\EmployeesTimer\target\EmployeesTimer-1.0-SNAPSHOT.jar.xml) not found. 

这是pom.xml:

  4.0.0 com.unilever EmployeesTimer 1.0-SNAPSHOT ejb EmployeesTimer  ${project.build.directory}/endorsed UTF-8    com.sun.jersey jersey-bundle 1.8   javax javaee-api 6.0 provided   org.codehaus.jackson jackson-mapper-asl 1.9.2   org.codehaus.jackson jackson-core-asl 1.9.2    org.slf4j slf4j-api 1.7.7   log4j log4j 1.2.17   org.slf4j slf4j-log4j12 1.7.7      org.apache.maven.plugins maven-compiler-plugin 2.3.2  1.6 1.6  ${endorsed.dir}     org.apache.maven.plugins maven-ejb-plugin 2.3  3.1    org.apache.maven.plugins maven-dependency-plugin 2.1   validate  copy   ${endorsed.dir} true   javax javaee-endorsed-api 6.0 jar           unknown-jars-temp-repo A temporary repository created by NetBeans for libraries and jars it could not identify. Please replace the dependencies in this repository with correct ones and delete this repository. file:${project.basedir}/lib   m2.dev.java.net http://download.java.net/maven/2 default   prime-repo PrimeFaces Maven Repository http://repository.primefaces.org default    

我确认我有2个简单的ejb

 @Stateless public class EmployeesFacade {} @Singleton public class TimerService { @EJB EmployeesFacade emloyeesFacade; } 

这是代码:

首先是@singleton ejb bean

 package com.employeestimer.services; import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.ClientResponse; import com.sun.jersey.api.client.WebResource; import com.unilever.employeestimer.enums.ConnectionEnum; import com.unilever.employeestimer.exceptions.BusinessException; import java.io.IOException; import javax.ejb.EJB; import javax.ejb.Schedule; import javax.ejb.Singleton; import javax.naming.NamingException; import javax.ws.rs.core.MediaType; import org.codehaus.jackson.JsonProcessingException; import org.slf4j.LoggerFactory; @Singleton public class TimerService { static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(TimerService.class); @EJB EmployeesFacade emloyeesFacade; private final static String U_ENGAGE_URL = "http://..../webresources/employees/update"; @Schedule(second="*", minute="*/1",hour="*", persistent=false) public void doWork() throws JsonProcessingException, IOException, NamingException{ try{ String input = emloyeesFacade.getUsersData(ConnectionEnum.USERNAME.getCode(), ConnectionEnum.PASSWORD.getCode()); consumeRESTfulWebService(input); }catch(BusinessException e){ LOGGER.error("",e); } } private void consumeRESTfulWebService(String input){ try { LOGGER.debug("input = " + input); Client client = Client.create(); WebResource webResource = client.resource(U_ENGAGE_URL); ClientResponse response = webResource.type(MediaType.TEXT_PLAIN).post(ClientResponse.class, input); if (response.getStatus() != ClientResponse.Status.NO_CONTENT.getStatusCode()) { throw new RuntimeException("Failed : HTTP error code : " + response.getStatus()); } LOGGER.debug("Output from Server .... \n"); } catch (Exception e) { LOGGER.error("",e); } } } 

这是Facade bean:

 package com.employeestimer.services; import com.employeestimer.beans.EmployeeData; import com.employeestimer.enums.ConfigurationsEnum; import com.employeestimer.enums.ConnectionEnum; import com.employeestimer.exceptions.BusinessException; import java.io.IOException; import java.util.ArrayList; import java.util.Hashtable; import java.util.List; import javax.ejb.Stateless; import javax.naming.Context; import javax.naming.NamingEnumeration; import javax.naming.NamingException; import javax.naming.directory.Attribute; import javax.naming.directory.SearchControls; import javax.naming.directory.SearchResult; import javax.naming.ldap.Control; import javax.naming.ldap.InitialLdapContext; import javax.naming.ldap.LdapContext; import javax.naming.ldap.PagedResultsControl; import javax.naming.ldap.PagedResultsResponseControl; import org.codehaus.jackson.JsonProcessingException; import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.map.ObjectWriter; import org.slf4j.LoggerFactory; @Stateless public class EmployeesFacade { static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(EmployeesFacade.class); public String getLDAPConnectionType() { return ConfigurationsEnum.LDAP_Connection_Type.getCode(); } public String getDomain() { return ConfigurationsEnum.DOMAIN.getCode(); } public String getLDAPIP() { return ConfigurationsEnum.LDAP_IP.getCode(); } public String getLDAPPort() { return ConfigurationsEnum.LDAP_PORT.getCode(); } public String getLDAPBase() { return ConfigurationsEnum.LDAP_BASE.getCode(); } private LdapContext getContext(String username, String password) throws BusinessException, NamingException { Hashtable env = new Hashtable(); if (getDomain() == null || getLDAPConnectionType() == null || getLDAPIP() == null || getLDAPPort() == null) { throw new BusinessException("error_general"); } String domain = getDomain(); String url = getLDAPConnectionType() + "://" + getLDAPIP() + ":" + getLDAPPort(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); env.put(Context.PROVIDER_URL, url); env.put(Context.SECURITY_AUTHENTICATION, "simple"); env.put(Context.REFERRAL, "follow"); if (!username.contains("@")) { username = username + "@" + domain; } env.put(Context.SECURITY_PRINCIPAL, username); env.put(Context.SECURITY_CREDENTIALS, password); return new InitialLdapContext(env, null); } public String getUsersData(String username, String password) throws BusinessException, JsonProcessingException, IOException, NamingException { List employeelist = new ArrayList(); EmployeeData employee; String json = ""; try { LdapContext context = getContext(username, password); SearchControls constraints = new SearchControls(); constraints.setSearchScope(SearchControls.SUBTREE_SCOPE); String[] attrIDs = {"mail"}; //, "sn", "cn", "c", "l"}; constraints.setReturningAttributes(attrIDs); // Activate paged results int pageSize = Integer.parseInt(ConnectionEnum.PAGESIZE.getCode()); byte[] cookie = null; context.setRequestControls(new Control[]{new PagedResultsControl(pageSize, Control.NONCRITICAL)}); int total; NamingEnumeration result = null; do { /* perform the search */ result = context.search(getLDAPBase(), "(&(objectClass=User)(c=EG))", constraints); /* for each entry print out name + all attrs and values */ while (result != null && result.hasMore()) { SearchResult entry = (SearchResult) result.next(); employee = new EmployeeData(); Attribute attribute; if (entry.getAttributes() != null) { if (entry.getAttributes().get("mail") != null) { attribute = entry.getAttributes().get("mail"); employee.setEmail(attribute != null ? attribute.toString().replace("mail: ", "") : ""); employeelist.add(employee); } } } // Examine the paged results control response Control[] controls = context.getResponseControls(); if (controls != null) { for (int i = 0; i < controls.length; i++) { if (controls[i] instanceof PagedResultsResponseControl) { PagedResultsResponseControl prrc = (PagedResultsResponseControl) controls[i]; total = prrc.getResultSize(); if (total != 0) { LOGGER.debug("***************** END-OF-PAGE " + "(total : " + total + ") *****************\n"); } else { LOGGER.debug("***************** END-OF-PAGE " + "(Page no. " + i + ") ***************\n"); } cookie = prrc.getCookie(); } } } else { LOGGER.debug("No controls were sent from the server"); } // Re-activate paged results context.setRequestControls(new Control[]{new PagedResultsControl( pageSize, cookie, Control.CRITICAL)}); } while (cookie != null); //result.close(); context.close(); ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter(); json = ow.writeValueAsString(employeelist); LOGGER.debug("\n \n \n ************* \n ************* \n ************* \n \n THE SIZE = " + employeelist.size() + "\n \n ************* \n ************* \n ************* \n \n \n"); } catch (NamingException ex) { String detailmessage = ex.getExplanation(); if (detailmessage.contains(" 32 ")) { // User not Found throw new BusinessException("error_invalidUser"); } else if (detailmessage.contains(" 49 ")) { if (detailmessage.contains(" 775 ") || detailmessage.contains(" 701 ") || detailmessage.contains(" 533 ")) { //Invalid Account throw new BusinessException("error_invalidAccount"); } else { //Invalid Username or password throw new BusinessException("error_invalidUsernamePassword"); } } else { LOGGER.error("error_general", ex); throw new BusinessException("error_general"); } } return json; } } 

我没有看到您的设置有问题。 如果你真的在这个项目中有一些用@Singleton@Stateless注释的类,这应该可行。

但重要的一点是,如果您有任何在Glassfish的库中不可用的依赖项,则必须将它们与您的应用程序打包在一起,这是EJB / JAR打包所无法实现的。 您必须将其打包为WAR或EAR文件。

要快速入门,请尝试以下操作:

更改

 ejb 

 war 

并改变

   org.apache.maven.plugins maven-ejb-plugin 2.3  3.1   

   org.apache.maven.plugins maven-war-plugin 2.1.1  false   

如果要将其打包为EAR,可以使用maven-ear-plugin 。

也可以看看:

  • 在JavaEE 6 WAR vs EAR中打包EJB
  • Maven 2&Packaging ejb vs jar
  • 具有依赖库的Maven EJB打包
  • Adam Bien – Java EE 6战争新EAR?