将 EJB Jar 部署到 Glassfish 时出现异常
Posted
技术标签:
【中文标题】将 EJB Jar 部署到 Glassfish 时出现异常【英文标题】:Exception Deploying EJB Jar to Glassfish 【发布时间】:2011-10-28 10:37:14 【问题描述】:这是我第一次尝试使用 JMS。我成功创建/部署了一个包含可用于上传文件的 servlet 的 war 文件。上传文件时,它会向 JMS 队列发送一条消息。接下来我写了一个监听器来从队列中检索上传的消息,但是当我尝试部署它时,我得到了这个错误:
SEVERE: Invalid ejb jar [file-listener-ejb-1.0.jar]: it contains zero ejb.
Note:
1. A valid ejb jar requires at least one session, entity (1.x/2.x style), or message- driven bean.
2. EJB3+ entity beans (@Entity) are POJOs and please package them as library jar.
3. If the jar file contains valid EJBs which are annotated with EJB component level annotations (@Stateless, @Stateful, @MessageDriven, @Singleton), please check server.log to see whether the annotations were processed properly.
at com.sun.enterprise.deployment.util.EjbBundleValidator.accept(EjbBundleValidator.java:76)
...<snip>...
这是一个非常简单的项目,只有一个类,使用 Maven 构建。该类如下所示:
package my.package;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.ObjectMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@MessageDriven(mappedName = "jms/FileUploadedQueue", activationConfig =
@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue") )
public class FileListener implements MessageListener
private static Logger log = LoggerFactory.getLogger(FileListener.class);
public FileListener()
// empty constructor
public void onMessage(Message message)
try
log.info("Received message: " + ((TextMessage)message).getText());
catch (JMSException ex)
String error = "Received error code '"
+ ex.getErrorCode()
+ "' retrieving message from queue jms/FileUploadedQueue.";
Exception linkedEx = ex.getLinkedException();
if (linkedEx != null)
log.error(error += "Linked exception: ", linkedEx);
else
log.error(error, linkedEx);
我的 pom.xml 看起来像这样:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>my.package</groupId>
<artifactId>uploaded-file-listener</artifactId>
<version>1.0</version>
<packaging>ejb</packaging>
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.4.2</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.14</version>
</dependency>
<dependency>
<groupId>javax.jms</groupId>
<artifactId>jms</artifactId>
<version>1.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>6.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<compilerArguments>
<bootclasspath>$settings.localRepository/javax/javaee-endorsed-api/6.0/javaee-endorsed-api-6.0.jar$path.separator$sun.boot.class.path</bootclasspath>
</compilerArguments>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-ejb-plugin</artifactId>
<version>2.3</version>
<configuration>
<ejbVersion>3.1</ejbVersion>
</configuration>
</plugin>
</plugins>
</build>
</project>
这会构建一个 jar 文件,当我尝试部署到 Glassfish 3.1 服务器(通过管理控制台)时会导致上述错误。
由于我的课堂上有 @MessageDriven 注释,我不确定自己做错了什么。不幸的是,server.log 文件不包含有关该错误的更多详细信息。
我应该将罐子包装在耳朵中并部署它吗?
---------编辑---------
我创建了一个包含 ejb jar 的耳朵,当我将耳朵部署到 Glassfish 时,我得到了同样的错误。所以,我认为这一定与注释有关。但是,我查看了多个示例/教程,但看不出有什么问题。
欢迎任何见解/建议!
---------编辑两个---------
MANIFEST.MF 文件的内容:
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: <name>
Build-Jdk: 1.6.0_24
application.xml 的内容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE application PUBLIC
"-//Sun Microsystems, Inc.//DTD J2EE Application 1.3//EN"
"http://java.sun.com/dtd/application_1_3.dtd">
<application>
<display-name>FileListener-ear</display-name>
<module>
<ejb>file-listener-ejb-1.0.jar</ejb>
</module>
</application>
---------编辑三个---------
ejb-jar 文件内容:
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd"
version="3.1">
<display-name>FileListener</display-name>
<enterprise-beans>
<message-driven>
<ejb-name>FileListener</ejb-name>
<ejb-class>my.package.FileListener</ejb-class>
<transaction-type>Container</transaction-type>
</message-driven>
</enterprise-beans>
</ejb-jar>
【问题讨论】:
您的清单看起来如何?你有 application.xml 描述符吗?可能需要 ejb-jar.xml,具体取决于 AS 尝试使用的部署方法。 清单文件(在 jar 和 ear 中)由 Maven 自动生成。我已经用他们的内容和 application.xml 编辑了帖子。 【参考方案1】:您的 jar 文件是否包含 ejb-jar.xml 文件?如果它丢失了,那么它可以解释为什么整个事情在部署时会爆炸
【讨论】:
是的,确实如此。嗯,确实如此。我实际上删除了它,因为根据 Maven EJB 插件文档,如果使用 EJB 3.0(我是),它是可选的。无论是否包含文件,都会出现相同的错误。 是的,它是可选的,但是当它丢失时,有些人可能会表现得不稳定......在 v2.0 中拥有它...... 好的。我把它放回去并用 bean 配置更新它。以前,它几乎是一个空文件,因为我希望注释就足够了。我超越了无效的 ejb jar 错误,但现在收到“缺少目标 JNDI 名称”错误。但这是另一天/线程的问题。【参考方案2】:在 GF 4.1 上部署包含 EJB 和 WAR 以及几个 JAR 项目的 EAR 突然需要application.xml
。
在没有必要之前进行了许多部署。
【讨论】:
【参考方案3】:您是否尝试在部署时检查兼容性复选框并查看部署是否正常。我们也遇到了阻止部署的错误,并通过在部署时选中兼容性复选框来解决。
【讨论】:
以上是关于将 EJB Jar 部署到 Glassfish 时出现异常的主要内容,如果未能解决你的问题,请参考以下文章