Cruz: Class.forName() findet die Klasse nicht

Hallo Leute,

ich versuche gerade ein Servlet zu schreiben, das eine andere Klasse instatieren soll, um eine bestimmte Methode davon auszuführen. Der Name wird dynamisch übergeben, daher brauche ich den Aufruf Class.forName(), allerdingst findet es die Klasse nicht. Ich kriege einen ClassNotFoundException.

So sieht die Zeile in meinem Java Code aus:
Class ActionClass = Class.forName(nameOfClass);

und die Klasse, die ich verusche aufzurufen, liegt im selben Verzeichnis (und Package), wie das aufrufende Servlet.

Hat jemand einen Tipp, wie ich rausfinden kann, wieso die Klasse nicht gefunden wird?

Gruß,
Cruz

  1. Hi,

    So sieht die Zeile in meinem Java Code aus:
    Class ActionClass = Class.forName(nameOfClass);

    und die Klasse, die ich verusche aufzurufen, liegt im selben Verzeichnis (und Package), wie das aufrufende Servlet.

    Hat jemand einen Tipp, wie ich rausfinden kann, wieso die Klasse nicht gefunden wird?

    Dein Servlet liegt unter WEB-INF/classes oder 'gejared' unter WEB-INF/lib, richtig?

    Wenn die Klasse im selben Verzeichnis liegt wie Dein Servlet, dann muss sie auch zum selben package gehören, sonst funktioniert das nicht.

    Beispiel: voll-qualifizierter Name Deines Servlets:
    de.cruz.servlet.MeinServlet (das package statement im Source code lautet dann: package de.cruz.servlet;)

    dann sieht die Verzeichnisstruktur in Tomcat wie folgt aus:
    WEB-INF/classes/de/cruz/servlet/MeinServlet.class (analog dazu im jar-file)

    Angenommen, die Klasse MyActionClass heisst voll-qualifiziert:
    com.anywhere.mypackage.MyActionClass (package com.anywhere.mypackage;)

    dann sucht der ClassLoader in folgendem Verzeichnis nach der Klasse:
    WEB-INF/com/anywhere/mypackage

    Fehlt dieses (was ich vermute), bekommst Du obige Exception.

    Das bedeutet, Du musst die Package-Struktur auf Dateisystemebene nachbilden. Wenn du Zugriff auf den Quellcode der ActionClass hast, entferne mal das package statement und schaue, ob es dann funktioniert, wenn das class file im selben Verzeichnis wie Deine Servlet-Klasse liegt (_muss_ funktionieren).

    Viele Grüße,
    Martin

    1. Korrektur (hoffentlich die einzige ;-)),

      dann sucht der ClassLoader in folgendem Verzeichnis nach der Klasse:
      WEB-INF/com/anywhere/mypackage

      nein, hier: WEB-INF/classes/com/anywhere/mypackage

      Martin