# JMS ObjectMessage ClassNotFoundException



## unknown (23. Dez 2014)

Hallo zusammen

Ich probiere mit Jave EE (Netbeans verbunden mit Glasfish) ein einfaches Beispiel mit JMS zu erstellen.

Mein Beispiel funktioniert mit einem TextMessage fehlerfrei. Wenn ich es allerdings mit einem ObjectMessage versuche, dann scheitere ich an die ClassNotFoundException.

Ich habe zwei Projekte:

Projekt1: MyJavaQueue beinhaltet zwei Klassen:


```
public class MessageSender
{
  @Resource(mappedName = "jms/GlassFishMyConnectionFactory")
  private static ConnectionFactory connectionFactory;
  @Resource(mappedName = "jms/GlassFishMyQueue")
  private static Queue queue;

  public void produceMessages()
  {
    MessageProducer messageProducer;

    ObjectMessage personMessage;
    try
    {
      Connection connection = connectionFactory.createConnection();
      Session session = connection.createSession(false,
        Session.AUTO_ACKNOWLEDGE);
      messageProducer = session.createProducer(queue);

      personMessage = session.createObjectMessage();

      
      Person myPerson = new Person("Peter", "Hans");
      personMessage.setObject(myPerson);
      messageProducer.send(personMessage);

      messageProducer.close();
      session.close();
      connection.close();
    }
    catch (JMSException e)
    {
      e.printStackTrace();
    }
  }
  public static void main(String[] args)
  {
    new MessageSender().produceMessages();
  }
}
```


```
public class Person implements Serializable {
    private static final long serialVersionUID = 1L;
    
    private String lastname;
    private String firsname;

    public Person(String lastname, String firsname) {
        this.lastname = lastname;
        this.firsname = firsname;
    }

    
    public String getFirsname() {
        return firsname;
    }

    public String getLastname() {
        return lastname;
    }
    
}
```
Projekt2: MyReceiverJavaQueue beinhaltet ebenfalls zwei Klassen:

```
public class MessageReceiver
{
  @Resource(mappedName = "jms/GlassFishMyConnectionFactory")
  private static ConnectionFactory connectionFactory;
  @Resource(mappedName = "jms/GlassMyBookQueue")
  private static Queue queue;

  
  public void getObjects()
  {
    Connection connection;
    MessageConsumer messageConsumer;
    ObjectMessage personMessage;
    try
    {
      connection = connectionFactory.createConnection();
      Session session = connection.createSession(false,
        Session.AUTO_ACKNOWLEDGE);
      messageConsumer = session.createConsumer(queue);
      connection.start();

        personMessage = (ObjectMessage) messageConsumer.receive();
        if (personMessage != null)
        {
          System.out.println(((Person)personMessage.getObject()).getFirsname());
          System.out.println();
        }

      messageConsumer.close();
      session.close();
      connection.close();
    }
    catch (JMSException e)
    {
      e.printStackTrace();
    }
  }
  public static void main(String[] args)
  {
    new MessageReceiver().getObjects();
  }
}
```
und die Klasse Person habe ich auch nochmals in diesem Projekt kopiert.

Ich erhalte beim Ausführen von MessageReceiver die folgende Exception:

```
WARNING: [I500]: Caught JVM Exception: java.lang.ClassNotFoundException: myjavaqueue.Person
com.sun.messaging.jms.MessageFormatException: [C4015]: Deserialize message failed. - cause: java.lang.ClassNotFoundException: myjavaqueue.Person
	at com.sun.messaging.jmq.jmsclient.ObjectMessageImpl.getObject(ObjectMessageImpl.java:221) etc...
```

Die Beispiele, die ich im Netz angeschaut habe, sind genau wie mein Beispiel aufgebaut.
Kennt jemand bereits dieses Problem, bzw. die Lösung?


----------



## CptSocket (23. Dez 2014)

Hallo

Liegen die Personen Klassen jeweils in demselben Package?

Versuchs doch mal mit einem zusätzlichen Schnittstellen-Projekt, in welchem die Nachricht / Person liegt. Das Sender- und Empfängerprojekt spllen keine eigene Klasse Person definieren, sondern die aus dem neuen Projekt verwenden.

Freundliche Grüsse
CptSocket


----------



## unknown (24. Dez 2014)

Danke für die Antwort. 
Da ich in diesem Gebiet relativ neu bin, muss ich die folgende Frage stellen:
Wie kann man aus einem Projekt, auf eine Klasse in einem anderen Projekt zugreifen? 
Wenn das möglich ist, würde ich gerne auf die Klasse in meinem Senderprojekt zugreifen.


----------



## CptSocket (24. Dez 2014)

Hallo

In eclipse kannst du in den Einstellungen des Projektes Abhängigkeiten auf jars oder andere Projekte hinzufügen (ich habe gerade keinen pc zur Hand, sonst würde ich einen Screenshot machen). Auf der Konsole wäre es die Option -cp.


Freundliche Grüsse
CptSocket


----------

