Java auf PocketPC: -Xbootclasspath benutzen

Vatar

Erfahrenes Mitglied
Hi.
Nachdem ich nun endlich herausgefunden habe wie ich Derby mit dem Personal Profile auf der J9 VM zum laufen kriege, habe ich noch ein letztes Problem.

Ich muss alle jars die ich benötige über Bootstrap-ClassLoader laden. Ich halte mich an diese Seite.
Code:
\Programme\J9\PPRO10\bin\j9w.exe  "-jcl:ppro10" "-Xbootclasspath:\Programme\DerbyTester\DerbyTester.jar;\Programme\DerbyTester\lib\derby.jar;\Programme\DerbyTester\lib\derbyclient.jar;\Programme\DerbyTester\lib\jdbc.jar" project.DerbyTester

oder, wie es in der Referenz steht, mit dem Verweis auf die classes.zip
Code:
\Programme\J9\PPRO10\bin\j9w.exe  "-jcl:ppro10" "-Xbootclasspath:\Programme\J9\PPRO10\lib\jclPPro10\classes.zip;\Programme\DerbyTester\DerbyTester.jar;\Programme\DerbyTester\lib\derby.jar;\Programme\DerbyTester\lib\derbyclient.jar;\Programme\DerbyTester\lib\jdbc.jar" project.DerbyTester
hier ist dann aber auch das Problem dass die Verknüpfung zu lang wird

Thx
 
Hat keiner eine Idee?
In der IDE läuft das Programm, es muss jetzt nur noch auf meinem PocketPC laufen.
Das Problem ist halt auch dass ich keinerlei Fehlermeldung bekomme -> Es passiert einfach nichts. Und wenn ich es ohne den Bootstrap-ClassLoader mache, dann bekomme ich eine SecurityException.
 
Hallo!

Muss die Bibliothek auf jeden Fall im Bootclasspath liegen? (Wenn ja hast du irgendwas verbockt ;-)

Kannst du die Bibliothek nicht in den Classpath deiner Anwendung bringen bevor die main-Methode der Anwendung ausgeführt wird?

Die Klasse de.tutorials.X liegt unter c:/x.jar
Java:
/**
 * 
 */
package de.tutorials;

import java.io.File;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;

/**
 * @author Thomas.Darimont
 * 
 */
public class BootClassPathManipulationExample {

    static {
        try {
            addURLToClassLoader(BootClassPathManipulationExample.class
                    .getClassLoader(), new File("c:/x.jar").toURI().toURL());
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }
    

    private static void addURLToClassLoader(ClassLoader classLoader, URL url) {
        try {
            Method addUrlMethod = URLClassLoader.class.getDeclaredMethod("addURL", new Class[]{URL.class});
            addUrlMethod.setAccessible(true);
            addUrlMethod.invoke(classLoader, new Object[]{url});
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        try {
            System.out.println(Class.forName("de.tutorials.X"));
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

Gruß Tom
 
Ich hatte eine offizielle Webseite von IBM in der stand dass der Bootstrap-ClassLoader benutzt werden muss.
Wenn ich WSDD (Eclipse) eine Startkonfiguration erstelle und die jars nicht in Bootstrap packe bekomme ich diese Fehlermeldung. Aber ich werds jetzt erst einmal mit deinem Vorschlag probieren.

Danke
 
Also ich habs jetzt mal mit deiner Lösung probiert und leider bekomme ich dann immer noch die SecurityException.
Hab mich dann noch einmal auf die Suche nach der Webseite gemacht und hier ist sie.
 
Ich konnte es soeben lösen. Endlich

Ich musste beim Bootstrap-ClassLoader den Append-Modus verwenden. Dieser ClassLoader ist nur für die zusätzlichen jars zuständig (derby.jar, derbyclient.jar, jdbc.jar) der normale ClassLoader lädt mein eigenes jar.
Ein weiteres Problem war dass ich die Installation von J9 und auch mein Programm verschieben musste und zwar in das ROOT-Verzeichnis. Grund dafür ist, dass der aufruf des Programmes über eine Verknüpfung geschieht in der alle Parameter angegeben werden müssen (inklusive absoluten Pfaden). Und da die Verknüpfung nur maximal 255 Zeichen verträgt wirds sonst zu lang. Das jar kann nicht direkt ausgeführt werden, da dann eine andere VM geladen wird und ich schätze mal dass man an die Registry im Mobile Windows nicht rankommt.
 
Hallo!

Also hast du einfach den Pfad zum Jar "verkürzt" und einfach via -Xbootclasspath/a: die Geschichten in den BootClassPath angehängt...
Was du auch hättest Probieren können wäre die jars ins Ext Verzeichnis zu legen, so das sie vom ExtensionClassLoader geladen werden. (genauso böse wie im BootClassPath hinzufügen...). Der ExtensionClassLoader hängt unter dem BootClassLoader und über dem ApplicationClassLoader (das ist der ClassLoader der die Klasse mit der main Methode lädt).

Gruß Tom
 
Hallo!

na ja, durch das Hinzufügen von Klassen in den "ClassSpace" des BootClassLoaders könnte man Klassen aus "tiefer" gelegenen ClassLoadern verdecken. Weiterhin könnte Code der sich auf eine bestimmte Class-ClassLoader Konstellation verlässt unter diesen Umständen nicht mehr richtig funktionieren... oder Class - Konflikte hervorrufen.

Gruß Tom
 
Zurück