# JBoss, EAR, EJB und ClassNotFound



## Sym (18. Aug 2011)

Hallo,

ich nutze Maven 3, Java 6, JBoss 7.

Ich habe ein EAR, bestehend aus WAR und EJB. Bisher hat es auch funktioniert. Nun habe ich in der EJB-Einheit eine Dependency eingefügt und bekomme beim Deployment folgenden Fehler


```
12:55:31,736 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-2) MSC00001: Failed to start service jboss.deployment.unit."larmic-ts-ejb-1.0-SNAPSHOT.jar".INSTALL: org.jboss.msc.service.StartException in service jboss.deployment.unit."larmic-ts-ejb-1.0-SNAPSHOT.jar".INSTALL: Failed to process phase INSTALL of deployment "larmic-ts-ejb-1.0-SNAPSHOT.jar"
	at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:121)
	at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1765)
	at org.jboss.msc.service.ServiceControllerImpl$ClearTCCLTask.run(ServiceControllerImpl.java:2291)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) [:1.6.0_26]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) [:1.6.0_26]
	at java.lang.Thread.run(Thread.java:680) [:1.6.0_26]
Caused by: java.lang.RuntimeException: Error getting reflective information for class de.larmic.ts.ejb.user.impl.RegistrationLocal
	at org.jboss.as.server.deployment.reflect.DeploymentReflectionIndex.getClassIndex(DeploymentReflectionIndex.java:70)
	at org.jboss.as.ee.component.EEModuleClassDescription$DefaultConfigurator.configure(EEModuleClassDescription.java:144)
	at org.jboss.as.ee.component.EEClassConfigurationProcessor.deploy(EEClassConfigurationProcessor.java:100)
	at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:115)
	... 5 more
Caused by: java.lang.NoClassDefFoundError: de/larmic/ts/business/model/userdata/UserData
	at java.lang.Class.getDeclaredMethods0(Native Method) [:1.6.0_26]
	at java.lang.Class.privateGetDeclaredMethods(Class.java:2427) [:1.6.0_26]
	at java.lang.Class.getDeclaredMethods(Class.java:1791) [:1.6.0_26]
	at org.jboss.as.server.deployment.reflect.ClassReflectionIndex.<init>(ClassReflectionIndex.java:65)
	at org.jboss.as.server.deployment.reflect.DeploymentReflectionIndex.getClassIndex(DeploymentReflectionIndex.java:66)
	... 8 more
Caused by: java.lang.ClassNotFoundException: de.larmic.ts.business.model.userdata.UserData from [Module "deployment.larmic-ts-ejb-1.0-SNAPSHOT.jar:main" from Service Module Loader]
	at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:191)
	at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:358)
	at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:330)
	at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:307)
	at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:101)
	... 13 more
```

Da scheint ein Dependency-Problem vorzuliegen. 

Auschnitte aus meiner EJB-Pom:


```
<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-ejb-plugin</artifactId>
	<version>2.3</version>
	<configuration>
		<ejbVersion>3.1</ejbVersion>
		<archive>
			<manifest>
				<addClasspath>true</addClasspath>
			</manifest>
		</archive>
	</configuration>
</plugin>
```

Bei der dependency wird im Parent die Version angegeben.


```
<dependency>
	<groupId>de.larmic.ts</groupId>
	<artifactId>larmic-ts-business-model</artifactId>
</dependency>
```

Hat jemand eine Idee? Eine MANIFEST.MF muss ich doch nicht anlegen, das übernimmt doch Maven für mich.

Gruß und Dank


----------



## Sym (18. Aug 2011)

Inhalt der MANIFEST.MF:

```
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: larmic
Build-Jdk: 1.6.0_26
Class-Path: larmic-ts-business-model-1.0-SNAPSHOT.jar
```

Sieht gut aus. Könnte das am EAR liegen? Ich habe ebenfalls versucht, nur die EJB-Einheit zu deployen, mit demselben Ergebnis.


----------



## Sym (18. Aug 2011)

Ok, das Problem liegt in den EJBs.

Ich habe eine Methode hinzugefügt:


```
public void register(final UserData userData) {...}
```

und das UserData ist aus meinem larmic-ts-business-model.

Mal sehen.


----------



## Sym (18. Aug 2011)

Das Problem tritt ja nur beim Deployment auf. Zur Laufzeit findet der JBoss die Abhängigkeiten. 

Hat jemand einen Tip?


----------



## mvitz (18. Aug 2011)

Wie sieht denn die application.xml deines EARs aus?


----------



## Sym (18. Aug 2011)

Die wurde generiert:


```
<?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>larmic-ts-ear</display-name>
  <module>
    <web>
      <web-uri>larmic-ts-webservice-1.0-SNAPSHOT.war</web-uri>
      <context-root>/larmic-ts-webservice</context-root>
    </web>
  </module>
  <module>
    <web>
      <web-uri>larmic-ts-web-1.0-SNAPSHOT.war</web-uri>
      <context-root>/larmic-ts-web</context-root>
    </web>
  </module>
  <module>
    <ejb>larmic-ts-ejb-1.0-SNAPSHOT.jar</ejb>
  </module>
</application>
```

Da ist das entsprechende Jar nicht enthalten.


----------



## mvitz (18. Aug 2011)

Erst nachdem ich Glassfish 3 installiert habe (und dort eine vernünftige Fehlermeldung bekommen habe) hab ich das Problem gelöst bekommen.

Ich nehme an, dass dein WAR deine EJBs direkt referenziert, richtig? Wenn ja, dann passiert folgendes, dein EJB JAR wird einmal im EAR mitgeliefert und einmal im WAR unter WEB-INF/lib. Das führt dann dazu, dass der AppServer Probleme bekommt, da z.B. sämtliche EJBs doppelt vorhanden sind.

*Lösung:* Setzte im WAR Module die Abhängigkeit zum EJB Modul auf den scope provided.
Alternativ könntest du dein EJB Modul in zwei Module (z.B. api und impl) aufsplitten und dein WAR hängt dann nur noch vom API ab (hier sind dann nur Interfaces drin) und das Impl kommt mit ins EAR (hier sind die EJBs, die die API Interfaces implementieren drin).


----------



## TheDarkRose (18. Aug 2011)

mvitz hat gesagt.:


> *Lösung:* Setzte im WAR Module die Abhängigkeit zum EJB Modul auf den scope provided.
> Alternativ könntest du dein EJB Modul in zwei Module (z.B. api und impl) aufsplitten und dein WAR hängt dann nur noch vom API ab (hier sind dann nur Interfaces drin) und das Impl kommt mit ins EAR (hier sind die EJBs, die die API Interfaces implementieren drin).



Brauchst nicht mal extra zwei Module machen, sondern wenn alle EJB die vom WAR referenziert werden, ein LocalInterface implementieren und im WAR auch nur das LocalInterface referenziert wird, dann einfach normal das EJB-Modul als Abhängigkeit einbinden und packaging-type auf ejb-client. Ist ganz nice


----------



## mvitz (18. Aug 2011)

Stimmt, das geht dann aber auch nur, wenn man sich bei den EJBs und deren Interfaces an ein Namenschema hält (was ich nicht tue  )

Edit: Und zur Vollständigkeit: Maven EJB Plugin - Generating an EJB client


----------



## TheDarkRose (18. Aug 2011)

Naja, das Namenschema stellt kein großes Problem dar. Einfach die Inclusions und Exclusions des ebj-client änder  Sonst werden folgendes im default ausgeschlossen:

```
Default Exclusions:

**/*Bean.class
**/*CMP.class
**/*Session.class
**/package.html
```


----------



## Sym (18. Aug 2011)

Hallo,

danke für Eure Antworten. Leider ist das Problem damit unverändert.

Ich kann die Klassen zur Laufzeit ja auch in den EJBs verwenden. Das Problem ist nur, wenn ich die Klassen mit in eine Signatur einer Methode übernehme.

Sprich


```
package de.larmic.ts.ejb.user.impl;

import javax.ejb.Local;
import javax.ejb.Stateless;

import de.larmic.ts.business.model.userdata.UserData;
import de.larmic.ts.ejb.dummy.DummyDB;
import de.larmic.ts.ejb.exception.EmailAddressAlreadyInUseException;
import de.larmic.ts.ejb.user.Registration;

@Stateless(mappedName = "ejb/RegistrationLocal")
@Local(Registration.class)
public class RegistrationLocal implements Registration {

	@Override
	public void register(final UserData userData) {
		if (isEmailAddressAlreadyInUse(userData.getAuthentication().getEmail())) {
			throw new EmailAddressAlreadyInUseException();
		}
	}

	@Override
	public boolean isEmailAddressAlreadyInUse(final String email) {
		for (final UserData user : DummyDB.getInstance().getActiveUsers()) {
			if (user.getAuthentication().getEmail().equals(email)) {
				return true;
			}
		}

		return false;
	}

}
```

Obere Methode geht nicht, untere Methode alleine geht.


----------



## mvitz (18. Aug 2011)

Ich verstehe jetzt noch nicht ganz, wie dein Projekt insgesamt aufgebaut ist und was genau nicht funktioniert, evtl. würden da weitere Ausschnitte (z.B. die POMs) helfen.

Ansonsten habe ich versucht was zu bauen, komisch ist nur, dass mein Beispiel (siehe Anhang) jetzt unter Glassfish3 läuft, JBoss7 allerdings meckert beim aufrufen des Servlets (sourcen sind im mit drin, vorher .zip in .ear umbennen). Jemand da eine Idee?


----------



## Sym (18. Aug 2011)

Hier meine poms:

EJB:

```
<?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/xsd/maven-4.0.0.xsd">
	<parent>
		<groupId>de.larmic.ts</groupId>
		<artifactId>larmic-ts</artifactId>
		<version>1.0-SNAPSHOT</version>
	</parent>

	<modelVersion>4.0.0</modelVersion>
	<artifactId>larmic-ts-ejb</artifactId>
	<packaging>ejb</packaging>
	<name>larmic-ts-ejb Application</name>

	<build>
		<directory>target</directory>
		<outputDirectory>target/classes</outputDirectory>
		<finalName>${project.artifactId}-${project.version}</finalName>
		<testOutputDirectory>target/test-classes</testOutputDirectory>
		<sourceDirectory>src/main/java</sourceDirectory>
		<scriptSourceDirectory>src/main/scripts</scriptSourceDirectory>
		<testSourceDirectory>src/test/java</testSourceDirectory>
		<resources>
			<resource>
				<directory>src/main/resources</directory>
			</resource>
		</resources>
		<testResources>
			<testResource>
				<directory>src/test/resources</directory>
			</testResource>
		</testResources>
		<pluginManagement>
			<plugins>
				<plugin>
					<artifactId>maven-resources-plugin</artifactId>
					<version>2.4.3</version>
					<configuration>
						<encoding>UTF-8</encoding>
					</configuration>
				</plugin>
				<plugin>
					<artifactId>maven-compiler-plugin</artifactId>
					<version>2.3.2</version>
					<configuration>
						<source>1.6</source>
						<target>1.6</target>
					</configuration>
				</plugin>
				<plugin>
					<groupId>org.apache.maven.plugins</groupId>
					<artifactId>maven-ejb-plugin</artifactId>
					<version>2.3</version>
					<configuration>
						<ejbVersion>3.1</ejbVersion>
						<archive>
							<manifest>
								<addClasspath>true</addClasspath>
							</manifest>
						</archive>
						<generateClient>false</generateClient>
					</configuration>
				</plugin>
			</plugins>
		</pluginManagement>
	</build>

	<dependencies>
		<dependency>
			<groupId>org.jboss.spec</groupId>
			<artifactId>jboss-javaee-6.0</artifactId>
			<type>pom</type>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax</groupId>
			<artifactId>javaee-api</artifactId>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>de.larmic.ts</groupId>
			<artifactId>larmic-ts-business-model</artifactId>
		</dependency>
	</dependencies>
</project>
```

WAR:

```
<?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/xsd/maven-4.0.0.xsd">
	<parent>
		<groupId>de.larmic.ts</groupId>
		<artifactId>larmic-ts</artifactId>
		<version>1.0-SNAPSHOT</version>
	</parent>

	<modelVersion>4.0.0</modelVersion>
	<artifactId>larmic-ts-ear</artifactId>
	<packaging>ear</packaging>
	<name>larmic-ts-ear Application</name>

	<build>
		<directory>target</directory>
		<outputDirectory>target/classes</outputDirectory>
		<finalName>${project.artifactId}-${project.version}</finalName>
		<testOutputDirectory>target/test-classes</testOutputDirectory>
		<sourceDirectory>src/main/java</sourceDirectory>
		<scriptSourceDirectory>src/main/scripts</scriptSourceDirectory>
		<testSourceDirectory>src/test/java</testSourceDirectory>
		<resources>
			<resource>
				<directory>src/main/resources</directory>
			</resource>
		</resources>
		<testResources>
			<testResource>
				<directory>src/test/resources</directory>
			</testResource>
		</testResources>
		<pluginManagement>
			<plugins>
				<plugin>
					<artifactId>maven-resources-plugin</artifactId>
					<version>2.4.3</version>
					<configuration>
						<encoding>UTF-8</encoding>
					</configuration>
				</plugin>
				<plugin>
					<artifactId>maven-compiler-plugin</artifactId>
					<version>2.3.2</version>
					<configuration>
						<source>1.6</source>
						<target>1.6</target>
					</configuration>
				</plugin>
				<plugin>
					<groupId>org.apache.maven.plugins</groupId>
					<artifactId>maven-ear-plugin</artifactId>
					<version>2.3.2</version>
					<configuration>
						<modules>
							<webModule>
								<groupId>de.larmic.ts</groupId>
								<artifactId>larmic-ts-web</artifactId>
							</webModule>
							<ejbModule>
								<groupId>de.larmic.ts</groupId>
								<artifactId>larmic-ts-ejb</artifactId>
							</ejbModule>
							<!-- jarModule>
								<groupId>de.larmic.ts</groupId>
								<artifactId>larmic-ts-business-model</artifactId>
								<bundleDir>larmicLib</bundleDir>
							</jarModule-->
						</modules>
						<archive>
							<manifest>
								<addClasspath>true</addClasspath>
							</manifest>
						</archive>
					</configuration>
				</plugin>
			</plugins>
		</pluginManagement>
	</build>

	<dependencies>
		<!-- dependency>
			<groupId>de.larmic.ts</groupId>
			<artifactId>larmic-ts-webservice</artifactId>
			<version>${project.version}</version>
			<type>war</type>
		</dependency-->
		<dependency>
			<groupId>de.larmic.ts</groupId>
			<artifactId>larmic-ts-web</artifactId>
			<version>${project.version}</version>
			<type>war</type>
		</dependency>
		<dependency>
			<groupId>de.larmic.ts</groupId>
			<artifactId>larmic-ts-ejb</artifactId>
			<version>${project.version}</version>
			<type>ejb</type>
		</dependency>
	</dependencies>
</project>
```


----------



## Sym (19. Aug 2011)

Also, er schlägt beim Deployment der EJB-Einheit fehl, wenn ich in die Methoden-Signatur eine externe Klasse verwende. Auch wenn ich das Interface in ein eigenes Projekt auslagere, erhalte ich den Fehler. 

Ich bin ratlos...


----------



## mvitz (19. Aug 2011)

Ich poste mal eben meine POMs für das oben hochgeladene Projekt, allerdings läuft das auch unter JBoss nicht (aber meine EJB wird deployed!).

[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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>de.mvitz.test.jf</groupId>
  <artifactId>javaee</artifactId>
  <version>1.0.0-SNAPSHOT</version>
  <packaging>pom</packaging>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.6</maven.compiler.source>
    <maven.compiler.target>1.6</maven.compiler.target>
  </properties>

  <modules>
    <module>domain</module>
    <module>service</module>
    <module>gui</module>
    <module>app</module>
  </modules>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>de.mvitz.test.jf.javaee</groupId>
        <artifactId>domain</artifactId>
        <version>${project.version}</version>
      </dependency>
      <dependency>
        <groupId>de.mvitz.test.jf.javaee</groupId>
        <artifactId>service</artifactId>
        <version>${project.version}</version>
        <type>ejb</type>
      </dependency>
      <dependency>
        <groupId>de.mvitz.test.jf.javaee</groupId>
        <artifactId>service</artifactId>
        <version>${project.version}</version>
        <type>ejb-client</type>
      </dependency>
      <dependency>
        <groupId>de.mvitz.test.jf.javaee</groupId>
        <artifactId>gui</artifactId>
        <version>${project.version}</version>
        <type>war</type>
      </dependency>
    </dependencies>
  </dependencyManagement>

</project>[/XML]

DOMAIN
[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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <parent>
    <groupId>de.mvitz.test.jf</groupId>
    <artifactId>javaee</artifactId>
    <version>1.0.0-SNAPSHOT</version>
  </parent>

  <groupId>de.mvitz.test.jf.javaee</groupId>
  <artifactId>domain</artifactId>

</project>[/XML]

EJB
[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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <parent>
    <groupId>de.mvitz.test.jf</groupId>
    <artifactId>javaee</artifactId>
    <version>1.0.0-SNAPSHOT</version>
  </parent>

  <groupId>de.mvitz.test.jf.javaee</groupId>
  <artifactId>service</artifactId>
  <packaging>ejb</packaging>

  <dependencies>
    <dependency>
      <groupId>de.mvitz.test.jf.javaee</groupId>
      <artifactId>domain</artifactId>
    </dependency>
    <dependency>
      <groupId>javax</groupId>
      <artifactId>javaee-api</artifactId>
      <version>6.0</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-ejb-plugin</artifactId>
        <version>2.3</version>
        <configuration>
          <ejbVersion>3.1</ejbVersion>
          <archive>
            <manifest>
              <addClasspath>true</addClasspath>
            </manifest>
          </archive>
          <generateClient>true</generateClient>
          <clientIncludes>
             <clientInclude>**/api/**</clientInclude>
          </clientIncludes>
        </configuration>
      </plugin>
    </plugins>
  </build>

</project>[/XML]

WAR
[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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <parent>
    <groupId>de.mvitz.test.jf</groupId>
    <artifactId>javaee</artifactId>
    <version>1.0.0-SNAPSHOT</version>
  </parent>

  <groupId>de.mvitz.test.jf.javaee</groupId>
  <artifactId>gui</artifactId>
  <packaging>war</packaging>

  <dependencies>
    <dependency>
      <groupId>de.mvitz.test.jf.javaee</groupId>
      <artifactId>service</artifactId>
      <type>ejb-client</type>
    </dependency>
    <dependency>
      <groupId>javax</groupId>
      <artifactId>javaee-api</artifactId>
      <version>6.0</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>

</project>[/XML]

EAR
[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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <parent>
    <groupId>de.mvitz.test.jf</groupId>
    <artifactId>javaee</artifactId>
    <version>1.0.0-SNAPSHOT</version>
  </parent>

  <groupId>de.mvitz.test.jf.javaee</groupId>
  <artifactId>app</artifactId>
  <packaging>ear</packaging>

  <dependencies>
    <dependency>
      <groupId>de.mvitz.test.jf.javaee</groupId>
      <artifactId>gui</artifactId>
      <type>war</type>
    </dependency>
    <dependency>
      <groupId>de.mvitz.test.jf.javaee</groupId>
      <artifactId>service</artifactId>
      <type>ejb</type>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-ear-plugin</artifactId>
        <version>2.5</version>
      </plugin>
    </plugins>
  </build>

</project>[/XML]

Wie gesagt, unter Glassfish v3 läuft das damit erstelle (und oben hochgeladene) EAR ohne Probleme, nur der JBoss kann das Servlet nicht erstelen (beim ersten Zugriff).


----------



## Sym (19. Aug 2011)

Danke Dir! 

Da vergleich ich mal.


----------



## Sym (19. Aug 2011)

Also ich habe das mal angepasst. Leider funktioniert das weder im JBoss noch im Glassfish bei mir. In beiden Fällen bekomme ich die Fehlermeldung.

Kannst Du bitte mal eine Beispiel Service-EJB posten?


----------



## mvitz (19. Aug 2011)

Na klar, anbei das gesamte Projekt im Anhang (habs gerade nochmal getestet, also das läuft unter Glassfish v3).


----------



## Sym (22. Aug 2011)

Danke noch mal. 

Dein Projekt tut es bei mir. Das ist doch schon mal was. Bei mir läuft es leider nicht, ich habe aber wesentlich mehr Abhängigkeiten.


```
Caused by: java.lang.ClassNotFoundException: de.larmic.ts.business.model.api.Test from [Module "deployment.larmic-ts-ejb-1.0-SNAPSHOT.jar:main" from Service Module Loader]
	at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:191)
	at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:358)
	at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:330)
	at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:307)
	at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:101)
	... 18 more

10:40:22,105 WARN  [org.jboss.as.server.deployment] (MSC service thread 1-6) Class Path entry jaxb-api.jar in "/content/larmic-ts-web-1.0-SNAPSHOT.war/WEB-INF/lib/jaxb-impl-2.2.1.jar"  does not point to a valid jar for a Class-Path reference.
10:40:22,106 WARN  [org.jboss.as.server.deployment] (MSC service thread 1-6) Class Path entry activation.jar in "/content/larmic-ts-web-1.0-SNAPSHOT.war/WEB-INF/lib/jaxb-impl-2.2.1.jar"  does not point to a valid jar for a Class-Path reference.
10:40:22,106 WARN  [org.jboss.as.server.deployment] (MSC service thread 1-6) Class Path entry jsr173_1.0_api.jar in "/content/larmic-ts-web-1.0-SNAPSHOT.war/WEB-INF/lib/jaxb-impl-2.2.1.jar"  does not point to a valid jar for a Class-Path reference.
10:40:22,106 WARN  [org.jboss.as.server.deployment] (MSC service thread 1-6) Class Path entry jaxb1-impl.jar in "/content/larmic-ts-web-1.0-SNAPSHOT.war/WEB-INF/lib/jaxb-impl-2.2.1.jar"  does not point to a valid jar for a Class-Path reference.
10:40:22,106 WARN  [org.jboss.as.server.deployment] (MSC service thread 1-6) Class Path entry larmic-ts-business-model-1.0-SNAPSHOT.jar in "/content/larmic-ts-web-1.0-SNAPSHOT.war/WEB-INF/lib/larmic-ts-ejb-1.0-SNAPSHOT-client.jar"  does not point to a valid jar for a Class-Path reference.
```
Was bedeuten diese Warnings? Kann das damit zusammenhängen?


----------



## mvitz (22. Aug 2011)

1. Also die Warnings sollten in meinem Projekt auch kommen (scheinbar hat der JBoss ein Problem damit, wenn ein JAR unter WAR/WEB-INF/lib ein MANIFEST.MF mit Classpath Eintrag besitzt.

2. Mein Projekt läuft bei dir auch, wenn du das Servlet aufrufst? (Das funktioniert bei mir nämlich nicht)

3. Wenn es sich nur um die JAXB Ahbängigkeiten handelt, die müsstest du weglassen können und zwar weil Java seit 1.6 JAXB direkt im JRE mit ausliefert, d.h. die dort gefundene Version wird sowieso als erste genutzt.


----------



## Sym (22. Aug 2011)

Alles klar, es liegt anscheinend am JBoss. Vielleicht warte ich da doch noch einmal Version 7.1 ab. Mit dem Glassfish tut es alles.

Danke nochmal!


----------



## Sym (22. Aug 2011)

mvitz hat gesagt.:


> 1. Also die Warnings sollten in meinem Projekt auch kommen (scheinbar hat der JBoss ein Problem damit, wenn ein JAR unter WAR/WEB-INF/lib ein MANIFEST.MF mit Classpath Eintrag besitzt.
> 
> 2. Mein Projekt läuft bei dir auch, wenn du das Servlet aufrufst? (Das funktioniert bei mir nämlich nicht)
> 
> 3. Wenn es sich nur um die JAXB Ahbängigkeiten handelt, die müsstest du weglassen können und zwar weil Java seit 1.6 JAXB direkt im JRE mit ausliefert, d.h. die dort gefundene Version wird sowieso als erste genutzt.


Nein, das Servlet tut es auch nicht. 

Ist wohl noch nicht so rund der AS


----------



## mvitz (22. Aug 2011)

Ja, wenn ich wüsste wo ich da jetzt genau nen Issue eintragen könnte bei JBoss würde ich es glatt tun, aber irgendwie hab ich das noch nicht so ganz gefunden.

Ich hab jetzt übrigens eine Lösung gefunden (die ich allerdings für sehr unschön halte).

Und zwar folgendes (ich gehe von meinem Projekt aus).

Da das service.jar ja von domain.jar abhängt (und domain.jar ja mit im EAR ist) muss man scheinbar dafür sorgen, dass das domain.jar NICHT mehr im WAR liegt, aber das WAR trotzdem die Klassen von domain.jar findet. Das lässt sich über META-INF/MANIFEST.MF im WAR File steuern (Classpath: domain.jar). Mit Maven kann man das dann lösen, indem man folgende pom.xml für das GUI Module nutzt:
[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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <parent>
    <groupId>de.mvitz.test.jf</groupId>
    <artifactId>javaee</artifactId>
    <version>1.0.0-SNAPSHOT</version>
  </parent>

  <groupId>de.mvitz.test.jf.javaee</groupId>
  <artifactId>gui</artifactId>
  <packaging>war</packaging>

  <dependencies>
    <dependency>
      <groupId>de.mvitz.test.jf.javaee</groupId>
      <artifactId>service</artifactId>
      <type>ejb-client</type>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>de.mvitz.test.jf.javaee</groupId>
      <artifactId>domain</artifactId>
      <optional>true</optional>
    </dependency>
    <dependency>
      <groupId>javax</groupId>
      <artifactId>javaee-api</artifactId>
      <version>6.0</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.1.1</version>
        <configuration>
          <packagingExcludes>WEB-INF/web.xml</packagingExcludes>
          <archive>
            <manifest>
              <addClasspath>true</addClasspath>
            </manifest>
          </archive>
        </configuration>
      </plugin>
    </plugins>
  </build>

</project>[/XML]

nicht schön, funktioniert aber. Evtl. hilft es dir ja doch noch, weiß ja nicht wie fest bei dir der JBoss gesetzt ist.


----------



## noirabys (24. Aug 2011)

Hallo zusammen!

da ich ebenfalls mit ClassNotFoundException im JBoss 7 kämpfe habe ich mir das ear mal genauer angeschaut.
und folgendes geändert:

1. domain nach lib verschoben
2. domain und service aus war gelöscht

nun deployt es und ich kann es erfolgreich aufrufen!

funktioniert mit jre 1.6_11, 1.7 und jboss 7.0.0.Final und 7.0.1.Final

Schönen Tag und Gruß
 Noirabys


----------



## Sym (25. Aug 2011)

Und hast Du das Problem auch mit Maven lösen können?


----------



## noirabys (25. Aug 2011)

hi!
ja hab ich, allerdings bin ich mir nicht 100% sicher, ob das so im Sinne der Erfinder umgesetzt ist

siehe Anhang

Viele Grüße,
 Noirabys


----------



## Sym (25. Aug 2011)

Danke, ich schau mir das am Wochenende mal an.


----------



## mvitz (25. Aug 2011)

Wow, in der Tat, dieses lib Verzeichnis scheint so einiges zu bewirken 

Ich würde es fast so nutzen, wie das, was du hochgeladen hast, habe nur ein paar Kleinigkeiten noch geändert.

1) Erstellen vom Manifest für das service Projekt abgestellt (ist dann nicht mehr nötig)
2) Erstellen des ejb-client wieder eingefügt (somit kann man aus der WebGUI nicht aus versehen auf Implementierungsklassen zurückgreifen
3) Entfernen der Abhängigkeit von GUI auf Domain (da Domain ja schon über den Service angezogen wird)

Ergebnis: Das nun erzeugte EAR lässt sich sowohl unter JBoss AS 7.0.1.final als auch unter Glassfish 3.1 ausführen.

Danke!

P.S.: Hab mein Projekt dann auch nochmal zur Vollständigkeit angehängt.


----------



## Sym (28. Aug 2011)

Danke nochmal euch beiden. 

Das Problem ist damit behoben! Es gibt noch ein CDI-Problem beim Inject der EJBs, welches aber mit dem JBoss 7.0.1 bereits behoben wurde.

Super! Und es ist immer schön zu sehen, wie sich die Leute so in einem Forum engagieren können!


----------

