Maven generiertes EAR lädt abhängige Lib beim deployen nicht

mschlegel

Erfahrenes Mitglied
Hallöle

Ich arbeite mich zur Zeit in JSF 2 und JPA 2 ein und habe hierzu eine kleine Webanwendung gestartet. Da ich bei der Persistenz die JPA packages nicht an die Geschäftslogik weitergeben will habe ich ein paar DAOs genommen. Nach einer Weile habe ich herausgefunden dass insbesondere die Transaktionshandhabung problematisch wird wenn ich mir den EntityManager nicht von einem Framework verwalten lasse (die Tests laufen über eine Embedded Derby Instanz im Speicher und da setze ich den EM manuell).

Deshalb habe ich das Project ein in ein AppServer EAR für Glassfish V3 umgewandelt. Spring wollte ich nicht nutzen weil erst Spring 3 wohl JSF2 und JPA2 Support bringt und ich jetzt nicht noch mehr mit Maven herumexperimentieren will.

Das Problem ist, dass beim deployen mein Projekt mit dem Domainmodel anscheinend nicht geladen wird obwohl es vorhanden ist..

Die Struktur schaut so aus
  1. itea-application (das EAR Projekt)
  2. itea-model (Nur das Domain-Model) --> genau das wird zum Schluss nicht gefunden
  3. itea-persist-ejb
  4. itea-presenter (Passive-View Pattern, kümmert sich um die Geschäftslogik)
  5. itea-webapp (JSF 2 kram)

Auch wenns etwas viel is, aber ohne die POMs wird mir wohl keiner helfen können ;) (ich hab ein paar Teile gekürzt)

Das PARENT-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/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>de.eye4eye</groupId>
	<artifactId>itea-parent</artifactId>
	<packaging>pom</packaging>
	<version>1.0.0-SNAPSHOT</version>
	<name>Itea</name>

	<modules>
		<module>../itea-application</module>
		<module>../itea-model</module>
		<module>../itea-persist-ejb</module>
		<module>../itea-presenter</module>
		<module>../itea-webapp</module>
	</modules>
...
</project>

EAR-POM
XML:
<?xml version="1.0" encoding="UTF-8"?>
<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/maven-v4_0_0.xsd">
	<parent>
		<groupId>de.eye4eye</groupId>
		<artifactId>itea-parent</artifactId>
		<version>1.0.0-SNAPSHOT</version>
	</parent>
	<modelVersion>4.0.0</modelVersion>

	<groupId>de.eye4eye</groupId>
	<artifactId>itea-application</artifactId>
	<packaging>ear</packaging>
	<name>ITEA Enterprise-Archive</name>
	<version>1.0.0-SNAPSHOT</version>
	<description />

	<dependencies>
		<dependency>
			<groupId>de.eye4eye</groupId>
			<artifactId>itea-persist-ejb</artifactId>
			<type>ejb</type>
			<version>1.0.0-SNAPSHOT</version>
		</dependency>
		<dependency>
			<groupId>de.eye4eye</groupId>
			<artifactId>itea-webapp</artifactId>
			<type>war</type>
			<version>1.0.0-SNAPSHOT</version>
		</dependency>
		<dependency>
			<groupId>de.eye4eye</groupId>
			<artifactId>itea-model</artifactId>
			<type>jar</type>
			<version>1.0.0-SNAPSHOT</version>
		</dependency>
		<dependency>
			<groupId>de.eye4eye</groupId>
			<artifactId>itea-presenter</artifactId>
			<type>jar</type>
			<version>1.0.0-SNAPSHOT</version>
		</dependency>
	</dependencies>

	<build>
		<finalName>itea-application</finalName>
		<plugins>
			<plugin>
				<artifactId>maven-ear-plugin</artifactId>
				<configuration>
					<defaultJavaBundleDir>APP-INF/lib</defaultJavaBundleDir>
					<modules>
						<javaModule>
							<groupId>de.eye4eye</groupId>
							<artifactId>itea-model</artifactId>
							<bundleDir>/</bundleDir>
						</javaModule>
						<javaModule>
							<groupId>de.eye4eye</groupId>
							<artifactId>itea-presenter</artifactId>
							<bundleDir>/</bundleDir>
						</javaModule>
						<ejbModule>
							<groupId>de.eye4eye</groupId>
							<artifactId>itea-persist-ejb</artifactId>
						</ejbModule>
						<webModule>
							<groupId>de.eye4eye</groupId>
							<artifactId>itea-webapp</artifactId>
						</webModule>
					</modules>
				</configuration>
			</plugin>
...

Model-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/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>de.eye4eye</groupId>
		<artifactId>itea-parent</artifactId>
		<version>1.0.0-SNAPSHOT</version>
		<relativePath>../itea-parent/pom.xml</relativePath>
	</parent>

	<groupId>de.eye4eye</groupId>
	<artifactId>itea-model</artifactId>
	<version>1.0.0-SNAPSHOT</version>
	<packaging>jar</packaging>
	<name>Itea Model</name>

	<repositories>
		<repository>
			<id>java.net</id>
			<name>Java.net Repository for Maven</name>
			<url>http://download.java.net/maven/2/</url>
		</repository>
		<repository>
			<id>maven2-repository.jboss.com</id>
			<name>JBoss Repository for Maven</name>
			<url>http://repository.jboss.com/maven2/</url>
		</repository>
	</repositories>

	<dependencies>
		<dependency>
			<groupId>javax.persistence</groupId>
			<artifactId>javax.persistence</artifactId>
			<version>2.0-SNAPSHOT</version>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.5</version>
			<scope>test</scope>
		</dependency>
	</dependencies>
</project>

EJB-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/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>de.eye4eye</groupId>
		<artifactId>itea-parent</artifactId>
		<version>1.0.0-SNAPSHOT</version>
		<relativePath>../itea-parent/pom.xml</relativePath>
	</parent>

	<artifactId>itea-persist-ejb</artifactId>
	<packaging>ejb</packaging>
	<version>1.0.0-SNAPSHOT</version>
	<name>Itea Persistence API</name>

...

	<dependencies>
		<dependency>
			<groupId>${project.groupId}</groupId>
			<artifactId>itea-model</artifactId>
			<version>${project.version}</version>
		</dependency>
		<dependency>
				<groupId>javax</groupId>
				<artifactId>javaee-api</artifactId>
				<version>6.0</version>
		</dependency>
		<dependency>
			<groupId>javax.persistence</groupId>
			<artifactId>javax.persistence</artifactId>
			<version>2.0-SNAPSHOT</version>
		</dependency>
		<dependency>
			<groupId>org.eclipse.persistence</groupId>
			<artifactId>eclipselink</artifactId>
			<version>2.0.0-SNAPSHOT</version>
		</dependency>
		<dependency>
			<groupId>org.apache.derby</groupId>
			<artifactId>derby</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>
	
	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-ejb-plugin</artifactId>
				<configuration>
					<ejbVersion>3.0</ejbVersion>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

Presenter-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/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>de.eye4eye</groupId>
		<artifactId>itea-parent</artifactId>
		<version>1.0.0-SNAPSHOT</version>
		<relativePath>../itea-parent/pom.xml</relativePath>
	</parent>

	<groupId>de.eye4eye</groupId>
	<artifactId>itea-presenter</artifactId>
	<version>1.0.0-SNAPSHOT</version>
	<packaging>jar</packaging>
	<name>Itea Presenter</name>

	<repositories>
		<repository>
			<id>java.net</id>
			<name>Java.net Repository for Maven</name>
			<url>http://download.java.net/maven/2/</url>
		</repository>
		<repository>
			<id>maven2-repository.jboss.com</id>
			<name>JBoss Repository for Maven</name>
			<url>http://repository.jboss.com/maven2/</url>
		</repository>
	</repositories>

	<dependencies>
		<dependency>
			<groupId>${project.groupId}</groupId>
			<artifactId>itea-model</artifactId>
			<version>${project.version}</version>
		</dependency>
		<dependency>
			<groupId>${project.groupId}</groupId>
			<artifactId>itea-persist-ejb</artifactId>
			<version>${project.version}</version>
		</dependency>
	</dependencies>
</project>

WebApp-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/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>de.eye4eye</groupId>
		<artifactId>itea-parent</artifactId>
		<version>1.0.0-SNAPSHOT</version>
		<relativePath>../itea-parent/pom.xml</relativePath>
	</parent>

	<groupId>de.eye4eye</groupId>
	<artifactId>itea-webapp</artifactId>
	<version>1.0.0-SNAPSHOT</version>
	<packaging>war</packaging>
	<name>ITEA WebApplication</name>

	...

	<dependencies>
		<dependency>
			<groupId>${project.groupId}</groupId>
			<artifactId>itea-model</artifactId>
			<version>${project.version}</version>
			<type>jar</type>
			<optional>false</optional>
		</dependency>
		<dependency>
			<groupId>${project.groupId}</groupId>
			<artifactId>itea-presenter</artifactId>
			<version>${project.version}</version>
			<type>jar</type>
			<optional>false</optional>
		</dependency>
		...
...
	
</project>

Ich kann jetzt alle Projekte bauen und es gibt kein Problem. Im ear Ordner lasse ich dann mvn ear:ear laufen und warte. Das EAR wollte ich dann in Glassfish manuell deployen um erst einmal zu sehen ob mit dem EJB-Kram (EntityManager) auch alles funktionier. DataSource und JNDI wurden vorher auch angelegt.

Beim deployen erhalte ich aber dann folgenden Fehler: Caused by: java.lang.ClassNotFoundException: de.eye4eye.itea.model.User

Also habe ich das ear untersucht, die jars und das war waren alle vorhanden aber im application.xml stand nur das
XML:
<application>
  <display-name>itea-application</display-name>
  <description></description>
  <module>
    <ejb>itea-persist-ejb-1.0.0-SNAPSHOT.jar</ejb>
  </module>
  <module>
    <web>
      <web-uri>itea-webapp-1.0.0-SNAPSHOT.war</web-uri>
      <context-root>/itea-webapp</context-root>
    </web>
  </module>
</application>
Ich habe mich gewundert warum die anderen zwei jar-module hier nicht aufgeführt waren und habe nach ein wenig googeln zur syntax noch das hier eingefügt
XML:
  <module>
    <java>itea-model-1.0.0-SNAPSHOT</java>
  </module>
  <module>
    <java>itea-presenter-1.0.0-SNAPSHOTr</java>
  </module>
Das ganze dann wieder ins archiv gepackt und wieder versucht zu deployen, aber es kommt der selbe Fehler.

Wieso werden die Klassen nicht geladen, obwohl die Jars vorhanden sind? (zimlich viel Text für so eine kurze Frage :D)
Ich hoffe einer der Spezialisten hier kann mir weiterhelfen
 
Zuletzt bearbeitet von einem Moderator:
Noch ein wenig googeln hat ergeben dass ein EJB-Modul anscheinend auch seine Utility-Libraries beinhalten muss (also in sich selbst). Es gibt wohl eine Möglichkeit in einer MANIFEST Datei einen Classpath eintrag hinzuzufügen aber wie das genau funktioniert ist mir noch etwas schleierhaft.

Außerdem wundert es mich warum Maven das nicht für mich erledigt. Gibt es da vielleicht irgendeinen bestimmten Befehl? Oder müssen gar mein Presenter- und Model-Projekt auch als EJBs erstellt werden?
 
Mich wunderts das niemand bisher ein ähnliches Problem hatte

Egal, ich hab die Lösung gefunden und falls noch jemand das Problem hat hier mal die Lösung
XML:
<plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-ejb-plugin</artifactId>
    <configuration>
      <ejbVersion>3.0</ejbVersion>
      <archive>
        <manifest>
          <addClasspath>true</addClasspath>
        </manifest>
      </archive>
    </configuration>
  </plugin>
  ...
</plugins>
Wichtig ist der addClasspath-Eintrag. Im EAR müssen die betreffenden Jars als <jarModule> eingetragen werden.
 
Zuletzt bearbeitet von einem Moderator:
Zurück