Question

Qu'est-ce que je suis en train

Je suis en train d'utiliser java.util.TreeMap dans une application J2ME. Je sais que TreeMap est présent sur J2SE mais pas sur J2ME, donc je l'ai fait quelques efforts pour porter le J2SE 6.0 TreeMap à J2ME 1.2 et inclus dans mon pot de Midlet. Cela impliquait la moitié portage du cadre des collections, mais maintenant je suis (théoriquement) fait avec cela et veulent le tester.

L'erreur

Mais quand je commence mon application sur un émulateur SDK J2ME SUN 3.0 (DefauldClclPhone2) Je reçois cette exception:

  java.lang.NoClassDefFoundError: java/util/TreeMap
   java.lang.Class.invoke_verify(), bci=0
   java.lang.Class.initialize(), bci=117
   com.companyname.test.TestMidlet.<init>(), bci=19
   java.lang.Class.newInstance(), bci=0
   com.sun.midp.main.CldcMIDletLoader.newInstance(), bci=46
   com.sun.midp.midlet.MIDletStateHandler.createMIDlet(), bci=66
   com.sun.midp.midlet.MIDletStateHandler.createAndRegisterMIDlet(), bci=17
   com.sun.midp.midlet.MIDletStateHandler.startSuite(), bci=27
   com.sun.midp.main.AbstractMIDletSuiteLoader.startSuite(), bci=52
   com.sun.midp.main.CldcMIDletSuiteLoader.startSuite(), bci=8
   com.sun.midp.main.AbstractMIDletSuiteLoader.runMIDletSuite(), bci=161
   com.sun.midp.main.AppIsolateMIDletSuiteLoader.main(), bci=26

Sur un vrai appareil que je reçois "Error in Application" mais ne peut pas voir l'exception réelle parce que je n'ai pas le SDK correspondant en ce moment.

Ce qui est Stange au sujet de cette erreur

Je suis surpris par le fait que ma demande a subi avec succès le processus de vérification préalable. J'ai toujours connu qu'une classe manquante (et j'ai eu beaucoup d'entre eux il y a quelques jours) déclenche une erreur dans la pré-vérification. Donc, je conclus que, après Successfull prévérification il ne peut y avoir NoClassDefFoundError sur l'appareil.

Détails

La structure du répertoire dans mon pot ressemble à ceci:

test.jar
    com
        companyname
            (my application classes, including the Midlet class)
    java
        lang
            Comarable.class
            Iterable.class
            (some others which are missing on J2ME)
        util
            TreeMap.class
            TreeSet.class
            (many others which are missing on J2ME)

J'ai aussi assuré que TreeMap.class est dans le format de fichier de classe Java 1.2.

je cible CDLC 1.0 et MIDP 1.0, donc mon pré-vérification utilise le ${wtk.home}/lib/cldc_1.0.jar, ${wtk.home}/lib/midp_1.0.jar classpath

Juste une pensée: Y at-il contrôle spécial dans le classloader J2ME qui l'empêche de charger une java.util.* ou classe java.lang.* d'un pot d'application? Je ne ai jamais entendu parler de cela, mais peut-être fait quelque chose comme cela comme une caractéristique de sécurité?

Conclusion et solution

Comme Joachim Sauer a souligné, le classloader ne se charge pas des classes dans java.* si je les définis. Donc, je devais les déplacer vers un autre paquet, en fait com.companyname.j2meport.java.util. Alors que mon propre code pourrait alors importer ces classes à partir de là, ce n'est pas une option pour closed-source de tiers-libs qui se réfèrent à java.util.TreeMap.

J'ai finalement réussi à changer ces références à mes propres classes en utilisant le mécanisme d'extension de Retrotranslator, un outil que j'utilisais déjà dans mon processus de construction, mais dont les capacités que je n'étais pas pleinement conscient.

Ma bibliothèque J2SE, qui a des dépendances sur d'autres bibliothèques J2SE, fonctionne maintenant sur J2ME!

Était-ce utile?

La solution

Seul le bootloader bootstrap peut charger des classes de paquets qui commencent par java..

Cela signifie que vous devrez déplacer votre classe dans un autre paquet.

Voir la JavaDoc ClassLoader.defineClass () pour plus de détails.

Autres conseils

Vous avez raison dans les deux cas - CLDC1.0 ne comprend pas NoClassDefFoundError (voir

scroll top