J2ME ne trouve pas ma mise en œuvre de java.util.TreeMap
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!
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