ClassnotfoundException zur Laufzeit im Maven2-Webprojekt

ifconfig

Aktives Mitglied
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
 

ifconfig

Aktives Mitglied
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

Top Contributor
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

Top Contributor
...
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

Top Contributor
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
 
G

Grinser

Gast
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:

Code:
<?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:

Code:
<?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?
 
G

Grinser

Gast
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.
 
M

maki

Gast
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.
 
G

Grinser

Gast
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...
 
M

maki

Gast
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 ;)
 
G

Grinser

Gast
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.
 

kama

Top Contributor
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
 

Ähnliche Java Themen

Neue Themen


Oben