4.3.6. Fehlerbehebung und Auflösung von Seam 2.2 Booking Archive Deployment Fehlern und Ausnahmen

Im vorherigen Schritt Abschnitt 4.3.5, »Erstellen und Deployment der JBoss EAP 5.X Version der Seam 2.2 Booking Applikation« haben Sie die JBoss EAP 5.X Seam 2.2 Booking Applikation erstellt und Sie zum JBoss EAP 6 Deployment-Ordner deployt. In diesem Schritt beheben Sie Fehler und lösen jeden Deployment-Fehler auf, auf den Sie treffen.

Wichtig

Applikationen, die Hibernate direkt mit Seam 2.2 verwenden, können eine innerhalb der Applikation gepackte Version von Hibernate 3 verwenden. Hibernate 4, welches mittels des org.hibernate Moduls der JBoss EAP 6 bereitgestellt wird, wird von Seam 2.2 nicht unterstützt. Dieses Beispiel soll Ihnen dabei helfen, Ihre Applikation auf der JBoss EAP 6 in Betrieb zu nehmen. Bitte beachten Sie, dass das Packen von Hibernate 3 mit einer Seam 2.2 Applikation keine unterstützte Konfiguration ist.

Prozedur 4.10. Fehlerbehebung und Auflösung von Deployment-Fehlern und Ausnahmen

  1. Problem - java.lang.ClassNotFoundException: javax.faces.FacesException
    Wenn Sie die Applikation deployen, so enthält das Protokoll den folgenden Fehler:
    ERROR \[org.jboss.msc.service.fail\] (MSC service thread 1-1) MSC00001: Failed to start service jboss.deployment.subunit."jboss-seam-booking.ear"."jboss-seam-booking.war".POST_MODULE:
    org.jboss.msc.service.StartException in service jboss.deployment.subunit."jboss-seam-booking.ear"."jboss-seam-booking.war".POST_MODULE:
    Failed to process phase POST_MODULE of subdeployment "jboss-seam-booking.war" of deployment "jboss-seam-booking.ear"
        (.. additional logs removed ...)
    Caused by: java.lang.ClassNotFoundException: javax.faces.FacesException from \[Module "deployment.jboss-seam-booking.ear:main" from Service Module Loader\]
        at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:191)
    
    Was es bedeutet:

    Die ClassNotFoundException zeigt eine fehlende Abhängigkeit an. In diesem Fall kann sie die Klasse javax.faces.FacesException nicht finden, und Sie müssen die Abhängigkeit ausdrücklich hinzufügen.

    Um das Problem zu beseitigen:

    Suchen Sie den Modulnamen für diese Klasse im EAP6_HOME/modules/system/layers/base/-Verzeichnis, indem Sie nach einem Pfad suchen, der mit der fehlenden Klasse übereinstimmt. In diesem Fall finden Sie 2 übereinstimmende Module:

    javax/faces/api/main
    javax/faces/api/1.2
    
    Beide Module besitzen denselben Modulnamen: javax.faces.api aber eines im Hauptverzeichnis ist für SF 2.0 und das im 1.2-Verzeichnis ist für JSF 1.2. Falls nur ein Modul verfügbar wäre, so könnten Sie einfach eine MANIFEST.MF-Datei erstellen und die Modulabhängigkeit hinzufügen. Aber in diesem Fall wollen Sie die JSF 1.2 Version und nicht die 2.0 Version im Hauptverzeichnis verwenden, weshalb Sie eine festlegen und die andere ausschließen müssen. Um dies zu tun, erstellen Sie eine jboss-deployment-structure.xml-Datei im META-INF/-Verzeichnis des EAR, die die folgenden Daten enthält:
    <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
      <deployment>
          <dependencies>
            <module name="javax.faces.api" slot="1.2" export="true"/>
          </dependencies>
      </deployment>
      <sub-deployment name="jboss-seam-booking.war">
        <exclusions>
            <module name="javax.faces.api" slot="main"/>
          </exclusions>
          <dependencies>
            <module name="javax.faces.api" slot="1.2"/>
          </dependencies>
      </sub-deployment>
    </jboss-deployment-structure>
    
    Im deployment-Abschnitt fügen Sie die Abhängigkeit für das javax.faces.api für das JSF 1.2 Modul hinzu. Sie fügen außerdem die Abhängigkeit für das JSF 1.2 Modul im Subdeployment-Abschnitt für das WAR hinzu und schließen das Modul für JSF 2.0 aus.

    Deployen Sie die Applikation, indem Sie die EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed-Datei löschen und eine leere jboss-seam-booking.ear.dodeploy-Datei in demselben Verzeichnis erstellen.
  2. Problem - java.lang.ClassNotFoundException: org.apache.commons.logging.Log
    Wenn Sie die Applikation deployen, so enthält das Protokoll den folgenden Fehler:
    ERROR [org.jboss.msc.service.fail] (MSC service thread 1-8) MSC00001: Failed to start service jboss.deployment.unit."jboss-seam-booking.ear".INSTALL:
    org.jboss.msc.service.StartException in service jboss.deployment.unit."jboss-seam-booking.ear".INSTALL:
    Failed to process phase INSTALL of deployment "jboss-seam-booking.ear"
        (.. additional logs removed ...)
    Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.Log from [Module "deployment.jboss-seam-booking.ear.jboss-seam-booking.war:main" from Service Module Loader]
    
    Was es bedeutet:

    Die ClassNotFoundException zeigt eine fehlende Abhängigkeit an. In diesem Fall kann sie die Klasse org.apache.commons.logging.Log nicht finden, und Sie müssen die Abhängigkeit ausdrücklich hinzufügen.

    Um das Problem zu beseitigen:

    Suchen Sie den Modulnamen für diese Klasse im EAP6_HOME/modules/system/layers/base/-Verzeichnis, indem Sie nach einem Pfad suchen, der mit der fehlenden Klasse übereinstimmt. In diesem Fall finden Sie ein Modul, das mit dem Pfad org/apache/commons/logging/ übereinstimmt. Der Modulname lautet “org.apache.commons.logging”.

    Bearbeiten Sie die jboss-deployment-structure.xml-Datei, um die Modulabhängigkeit zum Deployment-Abschnitt der Datei hinzuzufügen.
    <module name="org.apache.commons.logging" export="true"/>
    
    Die jboss-deployment-structure.xml sollte nun wie folgt aussehen:
    <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
      <deployment>
          <dependencies>
            <module name="javax.faces.api" slot="1.2" export="true"/>
            <module name="org.apache.commons.logging" export="true"/>
          </dependencies>
      </deployment>
      <sub-deployment name="jboss-seam-booking.war">
        <exclusions>
            <module name="javax.faces.api" slot="main"/>
          </exclusions>
          <dependencies>
            <module name="javax.faces.api" slot="1.2"/>
          </dependencies>
      </sub-deployment>
    </jboss-deployment-structure>
    
    Deployen Sie die Applikation, indem Sie die EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed-Datei löschen und eine leere jboss-seam-booking.ear.dodeploy-Datei in demselben Verzeichnis erstellen.
  3. Problem - java.lang.ClassNotFoundException: org.dom4j.DocumentException
    Wenn Sie die Applikation deployen, so enthält das Protokoll den folgenden Fehler:
    ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/seam-booking]] (MSC service thread 1-3) Exception sending context initialized event to listener instance of class org.jboss.seam.servlet.SeamListener: java.lang.NoClassDefFoundError: org/dom4j/DocumentException
        (... additional logs removed ...)
    Caused by: java.lang.ClassNotFoundException: org.dom4j.DocumentException from [Module "deployment.jboss-seam-booking.ear.jboss-seam.jar:main" from Service Module Loader]
    
    Was es bedeutet:

    Die ClassNotFoundException zeigt eine fehlende Abhängigkeit an. In diesem Fall kann sie die Klasse org.dom4j.DocumentException nicht finden.

    Um das Problem zu beseitigen:

    Suchen Sie den Modulnamen im EAP6_HOME/modules/system/layers/base/-Verzeichnis, indem Sie nach der org/dom4j/DocumentException suchen. Der Modulname ist “org.dom4j”. Bearbeiten Sie die jboss-deployment-structure.xml-Datei, um die Modulabhängigkeit zum Deployment-Abschnitt der Datei hinzuzufügen.

    <module name="org.dom4j" export="true"/>
    
    Die jboss-deployment-structure.xml-Datei sollte nun wie folgt aussehen:
    <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
      <deployment>
          <dependencies>
            <module name="javax.faces.api" slot="1.2" export="true"/>
            <module name="org.apache.commons.logging" export="true"/>
                <module name="org.dom4j" export="true"/>
              </dependencies>
      </deployment>
      <sub-deployment name="jboss-seam-booking.war">
        <exclusions>
            <module name="javax.faces.api" slot="main"/>
          </exclusions>
          <dependencies>
            <module name="javax.faces.api" slot="1.2"/>
          </dependencies>
      </sub-deployment>
    </jboss-deployment-structure>
    

    Deployen Sie die Applikation, indem Sie die EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed-Datei löschen und eine leere jboss-seam-booking.ear.dodeploy-Datei in demselben Verzeichnis erstellen.
  4. Problem - java.lang.ClassNotFoundException: org.hibernate.validator.InvalidValue
    Wenn Sie die Applikation deployen, so enthält das Protokoll den folgenden Fehler:
    ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/seam-booking]] (MSC service thread 1-6) Exception sending context initialized event to listener instance of class org.jboss.seam.servlet.SeamListener: java.lang.RuntimeException: Could not create Component: org.jboss.seam.international.statusMessages
        (... additional logs removed ...)
    Caused by: java.lang.ClassNotFoundException: org.hibernate.validator.InvalidValue from [Module "deployment.jboss-seam-booking.ear.jboss-seam.jar:main" from Service Module Loader]
    
    Was es bedeutet:

    Die ClassNotFoundException zeigt eine fehlende Abhängigkeit an. In diesem Fall kann sie die Klasse org.hibernate.validator.InvalidValue nicht finden.

    Um das Problem zu beseitigen:

    Es gibt ein Modul für “org.hibernate.validator”, aber das JAR enthält die org.hibernate.validator.InvalidValue-Klasse nicht, so dass das Hinzufügen der Modulabhängigkeit das Problem nicht behebt. In diesem Fall war das die Klasse enthaltende JAR Teil des JBoss EAP 5.X Deployments. Suchen Sie das JAR, das die fehlende Klasse im EAP5_HOME/seam/lib/-Verzeichnis enthält. Um dies zu tun öffnen Sie eine Konsole und geben Sie das folgende ein:

    $ cd EAP5_HOME/seam/lib
    $ grep 'org.hibernate.validator.InvalidValue' `find . -name '*.jar'`
    
    Das Ergebnis zeigt:
    $ Binary file ./hibernate-validator.jar matches
    $ Binary file ./test/hibernate-all.jar matches
    
    In diesem Fall kopieren Sie das hibernate-validator.jar in das jboss-seam-booking.ear/lib/-Verzeichnis:
    $ cp EAP5_HOME/seam/lib/hibernate-validator.jar jboss-seam-booking.ear/lib
    

    Deployen Sie die Applikation, indem Sie die EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed-Datei löschen und eine leere jboss-seam-booking.ear.dodeploy-Datei in demselben Verzeichnis erstellen.
  5. Problem - java.lang.InstantiationException: org.jboss.seam.jsf.SeamApplicationFactory
    Wenn Sie die Applikation deployen, so enthält das Protokoll den folgenden Fehler:
    INFO  [javax.enterprise.resource.webcontainer.jsf.config] (MSC service thread 1-7) Unsanitized stacktrace from failed start...: com.sun.faces.config.ConfigurationException: Factory 'javax.faces.application.ApplicationFactory' was not configured properly.
      at com.sun.faces.config.processor.FactoryConfigProcessor.verifyFactoriesExist(FactoryConfigProcessor.java:296) [jsf-impl-2.0.4-b09-jbossorg-4.jar:2.0.4-b09-jbossorg-4]
      (... additional logs removed ...)
    Caused by: javax.faces.FacesException: org.jboss.seam.jsf.SeamApplicationFactory
      at javax.faces.FactoryFinder.getImplGivenPreviousImpl(FactoryFinder.java:606) [jsf-api-1.2_13.jar:1.2_13-b01-FCS]
      (... additional logs removed ...)
      at com.sun.faces.config.processor.FactoryConfigProcessor.verifyFactoriesExist(FactoryConfigProcessor.java:294) [jsf-impl-2.0.4-b09-jbossorg-4.jar:2.0.4-b09-jbossorg-4]
      ... 11 more
    Caused by: java.lang.InstantiationException: org.jboss.seam.jsf.SeamApplicationFactory
      at java.lang.Class.newInstance0(Class.java:340) [:1.6.0_25]
      at java.lang.Class.newInstance(Class.java:308) [:1.6.0_25]
      at javax.faces.FactoryFinder.getImplGivenPreviousImpl(FactoryFinder.java:604) [jsf-api-1.2_13.jar:1.2_13-b01-FCS]
      ... 16 more
    
    Was es bedeutet:

    Die com.sun.faces.config.ConfigurationException und java.lang.InstantiationException zeigen ein Abhängigkeitenproblem an. In diesem Fall ist die Ursache nicht offenkundig.

    Um das Problem zu beseitigen:

    Sie müssen das Modul finden, das die com.sun.faces-Klassen enthält. Es gibt zwar kein com.sun.faces-Modul, aber es gibt zwei com.sun.jsf-impl-Module. Eine schnelle Prüfung des jsf-impl-1.2_13.jar im 1.2-Verzeichnis zeigt die com.sun.faces-Klassen. Wie bei der javax.faces.FacesException ClassNotFoundException wollen Sie die JSF 1.2 Version und nicht die JSF 2.0 Version im Hauptverzeichnis, daher müssen Sie eines festlegen und das andere ausschließen. Sie müssen die jboss-deployment-structure.xml bearbeiten, um die um die Modulabhängigkeit zum Deployment-Abschnitt der Datei hinzuzufügen. Sie müssen es auch zum WAR-Subdeployment hinzufügen und das JSF 2.0 Modul ausschließen. Die Datei sollte jetzt so aussehen:

    <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
      <deployment>
          <dependencies>
            <module name="javax.faces.api" slot="1.2" export="true"/>
                  <module name="com.sun.jsf-impl" slot="1.2" export="true"/>
            <module name="org.apache.commons.logging" export="true"/>
            <module name="org.dom4j" export="true"/>
          </dependencies>
      </deployment>
      <sub-deployment name="jboss-seam-booking.war">
        <exclusions>
            <module name="javax.faces.api" slot="main"/>
            <module name="com.sun.jsf-impl" slot="main"/>
          </exclusions>
          <dependencies>
            <module name="javax.faces.api" slot="1.2"/>
                  <module name="com.sun.jsf-impl" slot="1.2"/>
          </dependencies>
      </sub-deployment>
    </jboss-deployment-structure>

    Deployen Sie die Applikation, indem Sie die EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed-Datei löschen und eine leere jboss-seam-booking.ear.dodeploy-Datei in demselben Verzeichnis erstellen.
  6. Problem - java.lang.ClassNotFoundException: org.apache.commons.collections.ArrayStack
    Wenn Sie die Applikation deployen, so enthält das Protokoll den folgenden Fehler:
    ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/seam-booking]] (MSC service thread 1-1) Exception sending context initialized event to listener instance of class com.sun.faces.config.ConfigureListener: java.lang.RuntimeException: com.sun.faces.config.ConfigurationException: CONFIGURATION FAILED! org.apache.commons.collections.ArrayStack from [Module "deployment.jboss-seam-booking.ear:main" from Service Module Loader]
        (... additional logs removed ...)
    Caused by: java.lang.ClassNotFoundException: org.apache.commons.collections.ArrayStack from [Module "deployment.jboss-seam-booking.ear:main" from Service Module Loader]
    
    Was es bedeutet:

    Die ClassNotFoundException zeigt eine fehlende Abhängigkeit an. In diesem Fall kann sie die Klasse org.apache.commons.collections.ArrayStack nicht finden.

    Um das Problem zu beseitigen:

    Suchen Sie den Modulnamen im EAP6_HOME/modules/system/layers/base/-Verzeichnis, indem Sie nach dem org/apache/commons/collections-Pfad suchen. Der Modulname lautet “org.apache.commons.collections”. Bearbeiten Sie die jboss-deployment-structure.xml, um dem Deployment-Abschnitt der Datei die Modulabhängigkeit hinzuzufügen.

    <module name="org.apache.commons.collections" export="true"/>
    Die jboss-deployment-structure.xml-Datei sollte nun wie folgt aussehen:
    <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
      <deployment>
          <dependencies>
            <module name="javax.faces.api" slot="1.2" export="true"/>
                  <module name="com.sun.jsf-impl" slot="1.2" export="true"/>
            <module name="org.apache.commons.logging" export="true"/>
            <module name="org.dom4j" export="true"/>
            <module name="org.apache.commons.collections" export="true"/>
        </dependencies>
      </deployment>
      <sub-deployment name="jboss-seam-booking.war">
        <exclusions>
            <module name="javax.faces.api" slot="main"/>
            <module name="com.sun.jsf-impl" slot="main"/>
          </exclusions>
          <dependencies>
            <module name="javax.faces.api" slot="1.2"/>
                  <module name="com.sun.jsf-impl" slot="1.2"/>
          </dependencies>
      </sub-deployment>
    </jboss-deployment-structure>

    Deployen Sie die Applikation, indem Sie die EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed-Datei löschen und eine leere jboss-seam-booking.ear.dodeploy-Datei in demselben Verzeichnis erstellen.
  7. Problem - Dienste mit fehlenden/nicht verfügbaren Abhängigkeiten
    Wenn Sie die Applikation deployen, so enthält das Protokoll den folgenden Fehler:
    ERROR [org.jboss.as.deployment] (DeploymentScanner-threads - 2) {"Composite operation failed and was rolled back. Steps that failed:" => {"Operation step-2" => {"Services with missing/unavailable dependencies" => ["jboss.deployment.subunit.\"jboss-seam-booking.ear\".\"jboss-seam-booking.jar\".component.AuthenticatorAction.START missing [ jboss.naming.context.java.comp.jboss-seam-booking.\"jboss-seam-booking.jar\".AuthenticatorAction.\"env/org.jboss.seam.example.booking.AuthenticatorAction/em\" ]","jboss.deployment.subunit.\"jboss-seam-booking.ear\".\"jboss-seam-booking.jar\".component.HotelSearchingAction.START missing [ jboss.naming.context.java.comp.jboss-seam-booking.\"jboss-seam-booking.jar\".HotelSearchingAction.\"env/org.jboss.seam.example.booking.HotelSearchingAction/em\" ]","
      (... additional logs removed ...)
    "jboss.deployment.subunit.\"jboss-seam-booking.ear\".\"jboss-seam-booking.jar\".component.BookingListAction.START missing [ jboss.naming.context.java.comp.jboss-seam-booking.\"jboss-seam-booking.jar\".BookingListAction.\"env/org.jboss.seam.example.booking.BookingListAction/em\" ]","jboss.persistenceunit.\"jboss-seam-booking.ear/jboss-seam-booking.jar#bookingDatabase\" missing [ jboss.naming.context.java.bookingDatasource ]"]}}}
    
    Was es bedeutet:

    Wenn Sie einen “Services with missing/unavailable dependencies”-Fehler erhalten, sehen Sie sich den Text innerhalb der Klammern nach “missing” an. In diesem Fall sehen Sie:

    missing [ jboss.naming.context.java.comp.jboss-seam-booking.\"jboss-seam-booking.jar\".AuthenticatorAction.\"env/org.jboss.seam.example.booking.AuthenticatorAction/em\" ]
    
    Das “/em” steht für ein Problem mit dem Entity Manager und der Datenquelle.

    Um das Problem zu beseitigen:

    Bei der JBoss EAP 6 wurde die Datenquellenkonfiguration geändert und muss in der EAP6_HOME/standalone/configuration/standalone.xml-Datei definiert werden. Da die JBoss EAP 6 mit einer bereits in der standalone.xml-Datei definierten Datenbank geliefert wird, bearbeiten Sie die persistence.xml-Datei so, dass Sie die Beispieldatenbank in dieser Applikation verwendet. Wenn Sie sich die standalone.xml-Datei ansehen, so sehen Sie, dass der jndi-name für die Beispieldatenbank java:jboss/datasources/ExampleDS ist. Bearbeiten Sie die jboss-seam-booking.jar/META-INF/persistence.xml-Datei, um das bestehende jta-data-source-Element auszukommentieren und wie folgt zu ersetzen:

    <!-- <jta-data-source>java:/bookingDatasource</jta-data-source> -->
    <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>

    Deployen Sie die Applikation, indem Sie die EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed-Datei löschen und eine leere jboss-seam-booking.ear.dodeploy-Datei in demselben Verzeichnis erstellen.
  8. An diesem Punkt deployt die Applikation ohne Fehler, wenn Sie jedoch auf die URL http://localhost:8080/seam-booking/ in einem Browser zugreifen und "Account Login" versuchen, so erhalten Sie einen Runtime-Fehler “The page isn't redirecting properly”. Im nächsten Schritt lernen Sie wie Sie Runtime-Fehler beheben.
    Um mehr zur Fehlerbehebung und der Auflösung von Runtime-Problemen zu erfahren, klicken Sie hier: Abschnitt 4.3.7, »Fehlerbehebung und Auflösung von Seam 2.2 Booking Archive Runtime Fehlern und Ausnahmen«