2011-08-16 4 views
4

Это мой первый набег на использование JMS. У меня есть успешно созданный/развернутый файл войны, содержащий сервлет, который я могу использовать для загрузки файлов. Когда файл загружается, он отправляет сообщение в очередь JMS. Затем я написал слушатель, чтобы получить загруженные сообщения из очереди, но когда я пытаюсь установить его, я получаю эту ошибку:Исключение Развертывание EJB Jar в Glassfish

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> 

Это создает банку файл, который, когда я пытаюсь развернуть на моем Glassfish 3.1 сервера (с помощью консоли администратора) приводит к вышеуказанной ошибке.

Поскольку у меня есть аннотация @MessageDriven в моем классе, я не уверен, что я делаю неправильно. К сожалению, файл server.log больше не содержит сведений об ошибке.

Должен ли я упаковывать банку в ухо и развертывать это?

---------- РЕДАКТИРОВАТЬ ----------

Я создал ухо, который включает в банку EJB, и я получаю ту же ошибку, когда я развернуть ухо к Glassfish. Поэтому я думаю, что это должно быть связано с аннотацией. Однако я просмотрел несколько примеров/учебников, и я не вижу, что случилось.

Любые идеи/предложения были бы наиболее желанными!

---------- EDIT ДВА ----------

Содержание Manifest.mf файлов:

Manifest-Version: 1.0 
Archiver-Version: Plexus Archiver 
Created-By: Apache Maven 
Built-By: <name> 
Build-Jdk: 1.6.0_24 

Содержание заявки. 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> 

---------- EDIT ТРИ ----------

Содержание 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> 
+0

Как выглядят ваши МАНИФЕСТЫ? У вас есть дескриптор application.xml? Может потребоваться ejb-jar.xml в зависимости от того, с каким AS пытается его развернуть. – rapadura

+0

Файлы манифеста (как в банке, так и в ухе) автоматически генерируются Maven. Я отредактировал сообщение с их содержимым и application.xml. – sdoca

ответ

4

содержит ли файл банку файл EJB-jar.xml? Если он отсутствует, то это может объяснить, почему все это взрывается при развертывании.

+0

Да, да. Ну, да. Я фактически удалил его, потому что согласно документации Maven EJB plugin, это необязательно, если вы используете EJB 3.0 (что я). Такая же ошибка, независимо от того, включен ли файл или нет. – sdoca

+0

Да, это необязательно, но некоторые могут действовать неустойчиво, когда его не хватает ... У него было v2.0 ... – Dorpsidioot

+0

Хорошо. Я вернул его и обновил его конфигурацией bean. Раньше это был почти пустой файл, поскольку я ожидал, что аннотации будут достаточными. Я выхожу за неправильную ошибку jj jar jar, но теперь получаю ошибку «Missing Destination JNDI Name». Но это проблема для другого дня/потока. – sdoca

0

Развертывание на GF 4.1 нашего EAR, состоящего из EJB и WAR и нескольких проектов JAR, внезапно нуждается в application.xml.

Многие развертывания до этого не были необходимы.

0

enter image description here

ли вы пытаетесь установить флажок совместимости во время развертывания и посмотреть, если развертывает отлично. Мы также получили такую ​​ошибку, которая препятствовала развертыванию и была устранена, установив флажок совместимости во время развертывания.

Смежные вопросы