# Java auf PocketPC: -Xbootclasspath benutzen



## Vatar (28. August 2006)

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. 

```
\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

```
\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


----------



## Vatar (29. August 2006)

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.


----------



## Thomas Darimont (29. August 2006)

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

```
/**
 * 
 */
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


----------



## Vatar (29. August 2006)

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


----------



## Vatar (30. August 2006)

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.


----------



## Vatar (30. August 2006)

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.


----------



## Thomas Darimont (30. August 2006)

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


----------



## Vatar (30. August 2006)

Thomas Darimont hat gesagt.:
			
		

> genauso böse wie im BootClassPath hinzufügen...


Warum eigentlich?


----------



## Thomas Darimont (30. August 2006)

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


----------

