2010-09-19 8 views
4

Commencez avec un fichier JAR contenant un fichier texte JAX-WS SPI dans/META-INF, puis la classe vers laquelle il pointe. Mettez-le dans le classpath. Définissez contextClassLoader pour le thread en cours sur null.Lorsque Thread.currentThread(). GetContextClassLoader() renvoie la valeur null, que se passe-t-il?

Appelez la classe Service à partir de l'API JAX-WS dans JDK 1.6 et commencez à la parcourir. En l'absence d'un chargeur de classe de contexte, ce code appellera des méthodes statiques de Class pour trouver des choses.

Il trouvera avec succès le fichier SPI. Mais il ne trouvera pas la classe .class qu'elle nomme.

Si vous voulez vraiment essayer par vous-même, prenez Apache CXF 2.2.10, placez-le sur classpath et annulez le chargeur de classe de contexte.

Ce n'était pas un exercice de masochisme inutile: il s'avère que lorsque Open Office appelle une extension Java ('UNO'), il quitte le chargeur de classe de contexte null. Il a fallu une archéologie significative pour comprendre cela. Ce qui m'a laissé me demander, y a-t-il un bug JDK qui explique les résultats incohérents, ou un comportement spécifié que je ne comprends pas?

+1

On dirait qu'il utilise le chargeur de classe système (inclut les classes classpath) pour charger le fichier de services mais le chargeur de classe bootstrap pour charger la classe. 'grep -R Class.forName. | grep FactoryFinder' est divisé de manière à peu près égale sur lequel choisir (ne pas juste <3 clone-and-own code?). Bien sûr, si le même code était chargé à partir d'autre chose que le système, l'extension ou le chargeur de démarrage, il ne serait même pas capable de se trouver. –

+0

@Tom, eh bien, c'est réconfortant d'être capable de blâmer quelqu'un d'autre. Voulez-vous en faire une réponse pour que je puisse l'accepter? – bmargulies

+0

Quelle est la question? – irreputable

Répondre

1

Plusieurs bogues ont été soulevés pour ce genre de choses; par exemple. balayer les résultats de this query. La réponse générale de Sun est que ces fonctionnalités ne sont pas des bogues et ne seront pas corrigées. par exemple. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4155645.

La ligne du bas est que getContextClassLoaderpeut retourner null.

+0

Bien sûr. Mais c'est leur code JAX-WS qui est défectueux quand il est nul. – bmargulies

+0

Shrug. Des choses arrivent. Élever un rapport de bogue sur JAX-WS. –