Announcement

Collapse
No announcement yet.

Schwierigkeiten mit dem ClassLoader

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Schwierigkeiten mit dem ClassLoader

    <font color="#6688ff"><b>Ja Tag erst mal,</b></font><br>
    Ich habe das Problem das ich an einem "PluginInterface" arbeite und daher mein Projekt in mehrere Jar-Archive aufteile. Also in Plugins und dem eigentlichen Hauptprogramm.

    Der ClassPath für das Hauptprogramm wird ja automatisch beim starten des Jar-Archives festgelegt. Und damit man die Plugins auch benutzen kann, müssen diese Archive ja auch im ClassPath angegeben werden. Dies erledige ich intern durch <b>System.setProperty("java.class.path",&lt;ClassP ath&gt;</b>. Dabei habe ich schon beachtet das ich die neuen ClassPathes anhängen muss.

    Damit sollten die neuen Archive eigentlich im ClassPath stehen und der Zugriff auf diese für das Hauptprogramm annonymen Klassen möglich sein. Um nun ein solches Objekt zu bekommen verwende ich <b>getClass().forName("Klassenname ohne .class mit Pakten").newInstance();</b> . Dort erhalte ich aber immer eine ClassNotFoundException obwohl der ClassPath OK ist:

    <b>core.jar;F:\T-Daten\Projekte\Java\XNS\Core_002\root\plugin\Memor yView.jar</b>

    Somit steht im ClassPath das Plugin und das Hauptprogramm (Core). Ich sehe allerdings keinen Grund warum die Klasse welche in MemoryView.jar existiert nicht gefunden wird.

    <b>java.lang.ClassNotFoundException: net.xns.plugin.MemoryView.MemoryView</b>

    Aber genau diese Klasse existiert in MemoryView.jar und daher kann ich das einfach nicht verstehen. Muss man eventuel bei Java erst auf irgendeine Wiese den ClassPath aktualisiern oder wo könnte das Problem liegen? Ich weiss es einfach nicht...

    mfG Tobias Oelgarte

  • #2
    Hast du schon mal<br>
    Object obj = Class.forName(net.xns.plugin.MemoryView.MemoryView ).newInstance()<br>
    probiert

    Comment


    • #3
      ich habe das gleiche problem,
      scheinbar wird der classpath nur beim starten von java geparst

      Comment


      • #4
        Ein schönes Gefühl nicht allein zu sein :-)

        Allerdings bringst du mich gerade auf eine Idee, ich werde mal den ClassPath vorher durch eine Batch-Datei setzen. Mal sehen ob er es dann nimmt. Meld mich dann wieder..

        ...

        Bringt auch nichts, der kann die einfach nicht laden.

        <font size="2" color="#ff0000"><b>Hilfe!!!</b></font&gt

        Comment


        • #5
          Hi Tobias,

          der ClassLoader parst (aus Optimierungsgründen) java.class.path beim ersten Starten:<br>
          <snip><br>
          private static String[] initializePath(String propname) {<br>
          String ldpath = System.getProperty(propname, "");<br>
          </snip><br>

          <snip><br>
          static void loadLibrary(Class fromClass, String name,<br>
          boolean isAbsolute) {<br>
          ClassLoader loader = <br>
          (fromClass == null) ? null : fromClass.getClassLoader();<br>
          if (sys_paths == null) {<br>
          usr_paths = initializePath("java.library.path");<br>
          sys_paths = initializePath("sun.boot.library.path");<br>
          }<br>
          </snip><br>

          Lösung: eigener ClassLoader? Brauchst Du ein Beispiel (diesmal schneller, versprochen )? Sind aber auch schon welche im Forum...

          c

          Comment


          • #6
            Also ich habe von dir ein Beispiel gefunden. Allerdings auch gleich einen weiteren Komentar dazu welcher dieses in der Luft zerreist. Denn laut diesem Komentar ist es mit diesem ClassLoader nur möglich einzelne Klassen zu laden. Aber sobald diese Klassen weitere Klassen (in selben Archiv) benötigen, dann streikt der Classloader denn er hat ja nur eine ClassDatei geladen.

            Allerdings bräuchte ich dazu eine Lösung die dann alle Klassen automatisch zur Verfügung stellt. Oder habe ich auch den Source dort nicht ganz verstanden? Auf jeden Fall werde ich mir mal die Funktionsweise und den Source zum ClassLoader mal näher ansehen. Vieleicht finde ich ja dann noch eine Lösung. Allerdings etwas fertiges wäre auch nicht schlecht und würde mit sehr viel Zeit sparen. ;-)

            mfG Tobias Oelgart

            Comment


            • #7
              So jetzt melde ich mich schon wieder in meinem eigenen Thread, aber ich glaube jetzt eine Lösung gefunden zu haben. Denn die Idee mit dem ClassLoader ist schon Goldrichtig. Allerdings gibt es da ja auch schon einige schöne vorgefertigte Klassen. Ich würde dazu jetzt den <b>java.net.URLClassLoader</b> empfehlen. Denn bei diesem braucht man nur den Jar-File als URL angeben und nun steht dieses Jar-File wie ein im ClassPath befindliches Jar-File zur Verfügung und kann auch als solches benutzt werden.

              Wie man das jetzt allerdings genau nutzt, wies ich noch nicht 100%'ig, aber ich werde es schon rausfinden. Danach habe ich eigentlich vor ein ausführliches Beispiel ins Netz zu stellen, bzw. hier ins Forum

              Comment


              • #8
                Hallo Tobias,<br>
                tolle Idee mit dem java.net.URLClassLoader!! Habe mich auch geärgert,<br>
                dass System.setProperty("java.class.path") nur zu ClassNotFoundExceptions führt und wollte das ganze schon stecken:<br>
                aber jetzt geht's. Ich habe es mal für ein class file aus einem Directory ausprobiert, das wirkt, als wäre es im classpath:
                <pre><code>
                public class JMonClassLoader extends ClassLoader {

                public JMonClassLoader() {
                try {
                URL url = new URL("file://C:/TMT/src/DE/Siemens/zt/instrumentation/rmitool/EchoServer/");
                URL[] urls = new URL[1];
                urls[0] = url;
                URLClassLoader cl = new URLClassLoader(urls);
                Class c = cl.loadClass("rmitest.EchoServer_Test");
                System.out.println("name="+c.getName());
                }
                catch (Exception e) {
                e.printStackTrace();
                }
                }

                public static void main(String argv[]) {
                new JMonClassLoader();
                }
                </pre></code>
                Endlich ist die Exception weg und ich bekomme meine Class!<br>
                Wenn die URL mit einem "/" endet, wird ein Directory angenommen,<br>
                sonst ein jar file.<br>
                Danke für den tollen Tip!!!
                <p>
                Klaus

                Comment


                • #9
                  Hi,

                  ihr könnt meinen ClassLoader auch so erweitern, daß Ihr Ihm ein JAR hinwerft und er lädt euch den ganzen Inhalt. Aber macht mich ruhig fertig und zerreißt mich in der Luft

                  Wer noch Links braucht: www.ibm.com/developerworks, Dokument "Understanding the Java ClassLoader" hilft weiter, verweist auch zu Sun rüber.

                  Grüße an alle, Thoma

                  Comment


                  • #10
                    Jo,<br>
                    aber ich bin mittlerweile doch schon fündig geworden auch wenn ich das mit dem ZIP-FileClasLoader gar nicht mal so schelcht finde den du mir geschickt hast. Aber ich setze jetzt den java.net.URLClassLoader ein und der unterstützt JAR-Files direkt. ;-)

                    Außerdem hab ich mir genau die Dokumentationen dazu (auf die auch IBM verweist) angesehen. Ich denke das mein Wissen jetzt darüber schon vollständig ist. Allerdings habe ich mir vorgenommen dazu ein einfaches Beispiel zur Anwendung zu veröffentlichen. (kommt bald)..

                    mfG Tobias Oelgart

                    Comment


                    • #11
                      Vielen Dank für das Beispiel im Voraus, Tobias. (motivier)<p>
                      Marco (brauchte bisher noch kein Plugin, sammelt aber fleissig gute Beispiele

                      Comment


                      • #12
                        Hi Tobias,

                        habe gerade ein ähnliches Problem mit dem dynamische laden von JAR-Archiven.

                        Wäre nett wenn Du mir ein Code-Beispiel zur Verfügung stellen könntest.

                        Gruß Tom (eMail: [email protected]

                        Comment


                        • #13
                          hallo,

                          ich versuche fop in mein programm einzubinden,
                          so wie oben beschrieben wurde, leider vergeblich. ich kann die
                          klassen einfach nicht zugreifen.
                          liegt es vielleicht daran, dass die mehrere packages verschachtelt
                          sind? z.b. org.apache.fop.Fop, oder org.apache.log.format.Formatter.

                          hat jemand fop schon früher in programm eingebaut?
                          für jeden tip wäre ich sehr dankbar.

                          gruss an alle,
                          flanke

                          Comment

                          Working...
                          X