2011-08-16 4 views
4

Ceci est ma première incursion dans l'utilisation de JMS. J'ai réussi à créer/déployer un fichier war contenant une servlet que je peux utiliser pour télécharger des fichiers. Lorsqu'un fichier est téléchargé, il envoie un message à une file d'attente JMS. Ensuite, j'ai écrit un auditeur pour récupérer les messages téléchargés à partir de la file d'attente, mais lorsque je tente de le déployer, je reçois cette erreur:Exception Déploiement d'une jarre EJB sur 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>... 

C'est un projet très simple avec une classe, construit en utilisant Maven. La classe ressemble à ceci:

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); 
      } 
     } 
    } 
} 

Mon pom.xml ressemble à ceci:

<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> 

Ce builds un fichier jar qui lorsque je tente de déployer sur mon serveur GlassFish 3.1 (via la console d'administration) résulte dans l'erreur ci-dessus.

Étant donné que j'ai l'annotation @MessageDriven sur ma classe, je ne suis pas sûr de ce que je fais de mal. Malheureusement, le fichier server.log ne contient aucun autre détail sur l'erreur.

Dois-je emballer le bocal dans une oreille et le déployer?

---------- ---------- EDIT

J'ai créé une oreille qui comprend le pot de ejb, et je reçois la même erreur quand je déploie l'oreille à Glassfish. Donc, je pense que ça doit être quelque chose à voir avec l'annotation. Cependant, j'ai regardé plusieurs exemples/tutoriels et je ne peux pas voir ce qui ne va pas.

Toute idée/suggestion serait la bienvenue!

---------- EDIT DEUX ----------

Le contenu des fichiers MANIFEST.MF:

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

Contenu de la demande. 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 TROIS ----------

Contenu du fichier 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

À quoi ressemble votre MANIFEST? Avez-vous un descripteur application.xml? Un ejb-jar.xml peut être requis selon la méthode avec laquelle l'AS tente de le déployer. – rapadura

+0

Les fichiers manifest (à la fois dans le pot et l'oreille) sont générés automatiquement par Maven. J'ai modifié le post avec leur contenu et le fichier application.xml. – sdoca

Répondre

4

Est-ce que votre fichier jar contiennent un fichier ejb-jar.xml? S'il manquait, alors il pourrait expliquer pourquoi le tout explose au déploiement

+0

Oui, c'est le cas. Eh bien, ça l'a fait. Je l'ai effectivement enlevé car selon la documentation du plugin Maven EJB, c'est facultatif si j'utilise EJB 3.0 (ce que je suis). Même erreur, que le fichier soit inclus ou non. – sdoca

+0

Ouais, c'est facultatif, mais certains peuvent agir de manière erratique quand il manque ... l'avait avec v2.0 ... – Dorpsidioot

+0

Okay. Je l'ai remis et mis à jour avec la configuration du bean. Auparavant, c'était un fichier presque vide car je m'attendais à ce que les annotations soient suffisantes. J'arrive au-delà de l'erreur ejb jar invalide, mais je reçois maintenant une erreur "Missing Destination JNDI Name". Mais c'est un problème pour un autre jour/thread. – sdoca

0

Déployer sur GF 4.1 notre EAR qui se compose d'un EJB et WAR et plusieurs projets JAR a soudainement besoin d'un application.xml.

Plusieurs déploie avant que ce ne soit nécessaire.

0

enter image description here

Avez-vous essayé de cocher la case à cocher de compatibilité tout en déploiement et si déploie bien. Nous avons également obtenu une telle erreur empêchant le déploiement et a été résolue en vérifiant la case à cocher de compatibilité pendant le déploiement.

Questions connexes