# ClassnotfoundException zur Laufzeit im Maven2-Webprojekt



## ifconfig (5. Jun 2011)

Hallo,

immer wenn ich in Eclipse ein Dynamic Webproject anlege und dies mit Maven-Dependency-Management des m2eclipse-Plugins verwalte, muss ich trotzdem immer noch manuell die Maven-Dependency-JARs aus dem Maven-Repository in den WEB-INF/lib Ordner rein importieren!!! Weil sonst bekomme ich immer eine Classnotfound-Exception im Browser angezeigt! sowas muss doch automatisch gehen, dass die MAven-Dependency-JARS auch zur LAufzeit verfügbar gemacht werden, oder? Könnt ihr mir bitte sagen was ich da einstellen muss damit ich mir dieses manuelle Importgewurschtel da jedesmal spare?

Grüße
ifconfig


----------



## maki (5. Jun 2011)

Das Packaging muss auf [c]war[/c] stehen.


----------



## ifconfig (5. Jun 2011)

Super danke, jetzt gehts. Aber der lib-Folder im Eclipseprojekt bleibt trotzdem leer...also werden die jars nur dynamisch virtuell in den lib-Folder reinverlinkt zur Laufzeit, wenn ich das richtig verstehe.


----------



## tagedieb (5. Jun 2011)

Maven ist ein Build tool.

D.h. es compiliert deine Java files und kopiert deine Resources und deine Dependencies ins "target" directory. Und am Schluss wird daraus ein .war file erstellt.

Per default kopiert Maven nichts in deinen original Sourcecode.

Fuer Eclipse gibt es ein Maven plugin, welches deine Dependencies zum Classpath hinzufuegt, aber es werden niemals libraries in dein /WEB-INF/lib directory kopiert. (ausser du definierst das in deinem pom.xml)

In deinem Projekt Einstellungen kannst du definierten ob der "Maven" classpath auch deployt werden soll.


----------



## mvitz (5. Jun 2011)

tagedieb hat gesagt.:


> ...
> In deinem Projekt Einstellungen kannst du definierten ob der "Maven" classpath auch deployt werden soll.



Wobei man da dann ein wenig aufpassen muss, weil da dann natürlich auch JARs mit deployt werden, die bei einem Mavenbuild nachher nicht mit deployed werden (z.B. bei Scope "test"), da Eclipse die Scopes ja nicht trennt.


----------



## tagedieb (5. Jun 2011)

mvitz hat gesagt.:


> Wobei man da dann ein wenig aufpassen muss, weil da dann natürlich auch JARs mit deployt werden, die bei einem Mavenbuild nachher nicht mit deployed werden (z.B. bei Scope "test"), da Eclipse die Scopes ja nicht trennt.



Stimmt, ich hatte auch schon damit zu kaempfen, aber die 'test' libraries sind hier nicht das Problem. Es sind eher die als 'provided' definierten Libraries z.B. (servlet-api.jar) welche Classloader Probleme verursachen koennen.

In meinem Projekt hab ich das Maven Classpath deployment ausgeschaltet und dafuer aber die Libs in /target/<artifact>/WEB-INF/lib zum Deployment Assembly hinzugefuegt


----------



## Grinser (5. Jul 2012)

Ich habe das gleiche Problem und dieses Thema dazu gefunden. Ich habe zwei Projekte: Während eins die benötigten Maven Dependencies deployt, bekomme ich beim anderen Projekt ein ClassNotFound Exception.

*Laufendes Projekt:*

Pom:

<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>org.hibernate.tutorials</groupId>
    <artifactId>hibernate-tutorial</artifactId>
    <packaging>jar</packaging>
    <version>1.0.0-SNAPSHOT</version>
    <name>First Hibernate Tutorial</name>


    <dependencies>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>4.1.3.Final</version>
        </dependency>

        <!-- Because this is a web app, we also have a dependency on the servlet api. -->
<dependency>
	<groupId>org.apache.tomcat</groupId>
	<artifactId>servlet-api</artifactId>
	<version>6.0.35</version>
</dependency>

        <!-- Hibernate uses slf4j for logging, for our purposes here use the simple backend -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.6.4</version>
        </dependency>

        <!-- Hibernate gives you a choice of bytecode providers between cglib and javassist -->
        <dependency>
            <groupId>javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.12.1.GA</version>
        </dependency>

        <!-- Hibernate library dependecy end -->

	<dependency>
		<groupId>javax.transaction</groupId>
		<artifactId>jta</artifactId>
		<version>1.1</version>
	</dependency>

        <!-- HSQLDB -->
		  <dependency>
			<groupId>org.hsqldb</groupId>
			<artifactId>hsqldb</artifactId>
			<version>2.0.0</version>
		</dependency>

    </dependencies>

</project>

*ClassNotFound Projekt:*

Pom:


```
<?xml version="1.0"?>
 <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <artifactId>com-project</artifactId>
     <groupId>com.project</groupId>
     <version>1.0-SNAPSHOT</version>
   </parent>
 <groupId>com.project.core</groupId>
 <artifactId>com-project-core</artifactId>
 <version>1.0-SNAPSHOT</version>
 <packaging>war</packaging>
 <name>com-project-core Jersey Webapp</name>
<properties>
 <jersey-version>1.8</jersey-version>
</properties>
<dependencies>
<dependency>
  <groupId>com.project.facade</groupId>
  <artifactId>com-project-facade</artifactId>
  <version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
  <groupId>com.sun.jersey</groupId>
  <artifactId>jersey-server</artifactId>
  <version>${jersey-version}</version>
</dependency>
<dependency>
  <groupId>com.sun.jersey</groupId>
  <artifactId>jersey-json</artifactId>
  <version>${jersey-version}</version>
</dependency>
<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.8.2</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>com.sun.jersey</groupId>
  <artifactId>jersey-client</artifactId>
  <version>${jersey-version}</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>org.glassfish.distributions</groupId>
  <artifactId>web-all</artifactId>
  <version>10.0-build-20080430</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>org.glassfish.embedded</groupId>
  <artifactId>gf-embedded-api</artifactId>
  <version>1.0-alpha-4</version>
  <scope>test</scope>
</dependency>
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.14</version>
    <scope>provided</scope>
</dependency>

<!-- Upload Libs -->
<dependency>
        <groupId>com.sun.jersey.contribs</groupId>
        <artifactId>jersey-multipart</artifactId>
        <version>1.12</version>
</dependency>

            <!-- Hibernate -->

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>4.1.3.Final</version>
    </dependency>

    <!-- Because this is a web app, we also have a dependency on the servlet api. -->
    <dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>servlet-api</artifactId>
<version>6.0.35</version>
</dependency>

         <!-- Hibernate uses slf4j for logging, for our purposes here use the simple   backend -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-simple</artifactId>
        <version>1.6.4</version>
    </dependency>

        <!-- Hibernate gives you a choice of bytecode providers between cglib and javassist -->
      <dependency>
        <groupId>javassist</groupId>
        <artifactId>javassist</artifactId>
        <version>3.12.1.GA</version>
    </dependency>
    <!--  
 <dependency>
<groupId>org.hibernate.common</groupId>
<artifactId>hibernate-commons-annotations</artifactId>
<version>4.0.1.Final</version>
 </dependency>

    -->


  </dependencies>

   <repositories>
     <repository>
       <id>glassfish.java.net</id>
       <name>GlassFish Maven Repository</name>
       <url>http://download.java.net/maven/glassfish</url>
      </repository>
     <repository>
      <id>m2.java.net</id>
      <name>Java.net Maven 2 Repository</name>
      <url>http://download.java.net/maven/2</url>
     </repository>
   </repositories>
<pluginRepositories>
<pluginRepository>
    <id>m2.java.net</id>
    <name>Java.net Maven 2 Repository</name>
    <url>http://download.java.net/maven/2</url>
    </pluginRepository>
</pluginRepositories>
 <build>
    <finalName>com-project-core</finalName>
  <plugins>
  <plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <inherited>true</inherited>
<configuration>
      <source>1.6</source>
      <target>1.6</target>
    </configuration>
  </plugin>
  <plugin>
    <groupId>org.glassfish</groupId>
    <artifactId>maven-glassfish-plugin</artifactId>
  </plugin>
</plugins>
```

Parent Pom:


```
<?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>com.project</groupId>
<artifactId>com-project</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>

<name>com-project</name>
<url>http://maven.apache.org</url>

<modules>
  <module>com-project-core</module>
  <module>com-project-client</module>
</modules>

<properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<dependencies>
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>3.8.1</version>
    <scope>test</scope>
  </dependency>

   </dependencies>
 </project>
```


Es handelt sich um die Hibernate Libraries, nicht die Jersey, welche Test scoped sind. 

Wie kann ich das fixen ohne manuell alle jars ind den WEb-INF/lib Ordner zu packen?


----------



## tagedieb (6. Jul 2012)

Welche Klasse wird den nicht gefunden???


----------



## Grinser (6. Jul 2012)

Als letztes hatte ich die jboss-logging.jar dem WEB-INF/lib Ordner hinzugefügt. Nun bettelt er nach der jta.jar. Also er deployt die Jars aus den Dependencies nich wie im anderen Projekt wo es läuft.


----------



## maki (6. Jul 2012)

Man sollte schon sein Problem genau beschreiben wenn man hilfe möchte.

Eine ClassNotFoundException ist was ganz anderes als ein NoClassDefFoundError und per Trial & Error Jars nach WEB-INF/lib zu kopieren ist auch nicht wirklich zielführend.

So wie die Dinge bis jetzt beschrieben sind, kann dir hier keiner helfen.


----------



## Grinser (6. Jul 2012)

maki hat gesagt.:


> Man sollte schon sein Problem genau beschreiben wenn man hilfe möchte.
> 
> Eine ClassNotFoundException ist was ganz anderes als ein NoClassDefFoundError und per Trial & Error Jars nach WEB-INF/lib zu kopieren ist auch nicht wirklich zielführend.
> 
> So wie die Dinge bis jetzt beschrieben sind, kann dir hier keiner helfen.



Äh. ClassNotFound sowie NoClassDefFoundError konnte ich mit den letzten "Trial & Error copies" beide beseitigen. Und das es nicht zielführend ist ist mir klar, sonst würde ich nicht die Frage stellen warum es beim anderen Projekt anders läuft und wie ich es in diesem Projekt auch hinbekomme...


----------



## maki (6. Jul 2012)

Eine ClassNotFoundException hattest du wohl gar nicht, wird nur vom Compiler erzeugt, nicht zur Laufzeit.

Aber wie gesagt, so wie du dein Problem beschrieben hast kann dir hier keiner helfen, ist wohl eher sowas wie ein Trial&Error Blog


----------



## Grinser (6. Jul 2012)

Sehr fördernde Beiträge zur Problemlösung...

Als ich die logging jar hinzufügen sollte war es eine ClassNotFound Exception. Egal, habe alle Angaben zum Problem gemacht, wenn was fehlen sollte gibt man dem Problemsteller den Hinweis und tut es nicht ab mit : Dir kann nicht geholfen werden.


----------



## maki (6. Jul 2012)

Hier etwas für dich zum lesen:
http://www.java-forum.org/forum-faq-beitraege/7407-man-fragen-richtig-stellt.html


----------



## kama (6. Jul 2012)

Hi,

ich sehe, dass Du das maven-glassfish-plugin konfiguriert hast? Da frage ich mich doch ernsthaft, was das jetzt für ein Projekt  ist? WAR / EAR ? 

Weiterhin scheint hier ein Misverständnis bezgl. der Nutzung von Maven vorhanden zu sein:



> immer wenn ich in Eclipse ein Dynamic Webproject anlege und dies mit Maven-Dependency-Management des m2eclipse-Plugins verwalte, ...


Das ist der Falsche Weg...

1. Maven ist ein Build Tools und enthält die Wahrheit...

    Bedeutet man legt das Projekt mit Maven an und nicht mit Eclipse

2. m2eclipse Plugin von Eclipse sollte eigentlich nicht mehr verwendet werden

   Es sollte m2e Verwendung finden. Abgesehen davon m2e ist ein Maven Plugin
   für Eclipse und somit Verwaltet man die Dependencies in Maven und nicht 
   in Eclipse.


Weiterhin fällt mir auf, dass in der POM Repositories definiert sind... das gibt mir den Hinweis, dass kein Repository Manager Verwendung findet was recht ungünstig ist....

tagedieb hat auf einige dieser Punkte schon hingewiesen...

maki hat auch darauf hingewiesen, dass zu einer möglichen Problemlösung eine genau Problembeschreibung gehört...


Gruß
Karl-Heinz Marbaise


----------

