# POI, Maven, JBoss und ein java.lang.NoClassDefFoundError



## testfall (4. Jan 2008)

Hallo ich habe eine Webanwendung in dessen Controller ich die POI-Lib für excel etc. gebrauche.
Diese Lib habe ich über Maven mit 
    <dependency>
    	<groupId>org.apache.poi</groupId>
    	<artifactId>poi</artifactId>
    <version>3.0.2-beta1</version>
in die pom.xml im Controllerpackage eingebunden. Alles wird auch runtergeladen etc. und beim Maven build in das ear gepackt.
Wird aber der Code mit POI-Klassen ausgeführt, dann bekomme ich folgenden Fehler

11:41:41,562 FATAL [application] java.lang.NoClassDefFoundError: org/apache/poi/poifs/filesystem/POIFSFileSystem
javax.faces.el.EvaluationException: java.lang.NoClassDefFoundError: org/apache/poi/poifs/filesystem/POIFSFileSystem
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:91)
	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:91)
	at javax.faces.component.UICommand.broadcast(UICommand.java:383)
	at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:447)
	at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:752)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:97)
	at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
	...

Hat jemand eine Idee?
Danke


----------



## testfall (4. Jan 2008)

Am einfachsten ist es wenn man die poiX.jar in das JBoss/server/default/lib Verzeichnis legt, dieses ist aber nicht die gewünschte Lösung, da die jar ja schon im ear vorhanden ist...  :?


----------



## kama (4. Jan 2008)

Hallo,

da wäre meine erste Frage, wie die pom.xml dafür aussieht....und zweitens wie das resultierende ear file aussieht?....

MfG
Karl Heinz Marbaise


----------



## testfall (4. Jan 2008)

Auszug aus der pom.xml beim Controller


```
<dependency>
		<groupId>javax.ejb</groupId>
		<artifactId>ejb-api</artifactId>
	</dependency>
	
	<dependency>
    	<groupId>org.apache.poi</groupId>
    	<artifactId>poi</artifactId>
    <version>3.0.2-beta1</version>
	</dependency>

	</dependencies>
</project>
```


hier ein teil der pom.xml für die ejb 


```
<dependency>
		<groupId>org.jboss.seam</groupId>
		<artifactId>jboss-seam</artifactId>
			<exclusions>
	          <exclusion>
				<groupId>jboss</groupId>
				<artifactId>javassist</artifactId>
              </exclusion>
	          <exclusion>
				<groupId>javax.el</groupId>
				<artifactId>el-api</artifactId>
              </exclusion>              
	          <exclusion>
				<groupId>dom4j</groupId>
				<artifactId>dom4j</artifactId>
              </exclusion>              
            </exclusions> 
	</dependency>
 


		<dependency>
			<groupId>de.bonprix.teleshop</groupId>
			<artifactId>teleshop-controller-ejb</artifactId>
			<version>${project.version}</version>
			<type>ejb</type>
		</dependency> 

		<dependency>
			<groupId>de.bonprix.teleshop</groupId>
			<artifactId>teleshop-view-war</artifactId>
			<version>${project.version}</version>
			<type>war</type>
	    </dependency>

	</dependencies>


	<build>
		<finalName>${project.parent.artifactId}</finalName>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-ear-plugin</artifactId>
				<configuration>
					<displayName>XXXEAR</displayName>
					<description>${project.description} ${version}</description>
					
					<version>5</version>
					<modules>
  						<ejbModule>
							<groupId>de.xxx</groupId>
							<artifactId>xxx-model-ejb</artifactId>
						</ejbModule> 
 						<ejbModule>
							<groupId>de.xxx</groupId>
							<artifactId>xxx-controller-ejb</artifactId>
						</ejbModule> 
						<webModule>
							<groupId>de.xxx</groupId>
							<artifactId>teleshop-view-war</artifactId>
							<contextRoot>/xxx</contextRoot>
						</webModule>
						<javaModule>
					        <groupId>org.jboss.seam</groupId>
					        <artifactId>jboss-seam</artifactId>
							<bundleDir>/lib</bundleDir>
						</javaModule>												
						<javaModule>
					        <groupId>org.jboss.seam</groupId>
					        <artifactId>jboss-el</artifactId>						
					        <bundleDir>/lib</bundleDir>
						</javaModule>
					</modules>
				</configuration>
			</plugin>
		</plugins>
	</build>
```


Im EAR-content liegt die poi direkt im ear-contents:
-WEB-INF
-lib
-xxx.war
-xxx-controller.jar
-poi.jar
....

Da isses also.


Das war doch das wass Sie/Du haben wolltest, oder?


----------



## kama (4. Jan 2008)

Hallo,

hm...so weit ich weiß muss doch innerhalb eines EAR files auch eine application.xml vorhanden sein....

Inhalt app.ear:

```
/
    !
    +--- META-INF
    !       MANIFEST.MF
    !       application.xml
    +--- x.war
    +--- y.sar
```

Inhalt: y.sar:

```
/
    !
    +--- META-INF
    !     MANIFEST.MF
    +--- app.jar
```

Inhalt: app.jar:

```
/
    !
    +--- META-INF
    !
    +--- lib
    !     !
    !     +--- alle jars (auch POI).
    +--- eventuelle property files etc.
```

Achso die application.xml:

```
<application>
	<display-name>XXX</display-name>
	<module>
		<web>
			<web-uri></web-uri>
			<context-root></context-root>
		</web>
	</module
	<module
		<ejb>y.sar</ejb>
	</module>
</application>
```

So und soweit ich die Doku zu Maven verstanden habe, wird die application.xml sogar automatisch erzeugt...

http://maven.apache.org/plugins/mav...a-third-party-library-in-application-xml.html

Ich bin nämlich der Meinung, dass mit der genannten Struktur des EAR das deployment eigentlich schief gehen muss...Da müssen doch meldungen im Log vom JBoss zu sehen sein ? Das EJB Deployment muss explizit aufauchen.....

MfG
Karl Heinz Marbaise


----------



## testfall (4. Jan 2008)

Es wird deployed:


```
[EJB3Deployer] Deployed: 
[EJB3Deployer] Deployed: file:/C:/Programme/Jboss/server/default/tmp/deploy/tmp14944xxx.ear-contents/xxx-controller-ejb-0.1-SNAPSHOT.jar
...
file:/C:/Programme/Jboss/server/default/tmp/deploy/tmp14944xxx.ear-contents/xxx-model-ejb-0.1-SNAPSHOT.jar
16:16:53,250 INFO  [TomcatDeployer] deploy,
```


Eine .sar Datei habe ich nicht.

Auf meinem Server gibt es im deloyment ordner folgende struktur:

```
/
|
+-lib
|
+-META-INF
|
+-xxx-view-war-0.1-SNAPSHOT-exp.war
|
|--commons-logging-1.1.jar
|
|--ejb-api-3.0.jar
|
|--log4j-1.2.14.jar
|
|--poi-3.0.2-beta1.jar
|
|--xxx-controller-ejb-0.1-SNAPSHOT.jar
|
|--xxx-model-ejb-0.1-SNAPSHOT.jar
|
|--xxx-view-war-0.1-SNAPSHOT.war
```


Die application.xml wird von maven erzeugt.
Die poi-lib habe ich ja über die pom.xml eingebunden.

Danke.


----------



## kama (4. Jan 2008)

Hallo,



			
				testfall hat gesagt.:
			
		

> ```
> /
> |
> +-lib
> ...


Hm. Ich bin der Meinung, dass die ganzen Jar's hier in das "lib" verzeichnis müssen, damit Sie über den ClassPath gefunden werden können.

MfG
Karl Heinz Marbaise


----------



## testfall (24. Jan 2008)

Danke für die Antwort, muss ich bei Zeiten mal ausprobieren, bin letzter Zeit wgn Krankheit nicht dazu gekommen.
Mit der ejb-jar funktioniert es so aber ... mal gucken.

Grüße


----------

