2010-09-27 4 views
12

J'essaie de m'entraîner avec des chargeurs de classe personnalisés, et j'ai quelques questions. Est-il possible d'indiquer à la machine virtuelle Java d'utiliser globalement mon chargeur de classe personnalisé? Par exemple, j'ai écrit une petite application fonctionnant sous Tomcat 6. Le servlet est géré par le conteneur, où dois-je définir mon chargeur de classe? De plus, la webapp utilise des jar tiers, puis-je contrôler le chargement des classes de ces jarres? Les réponses à ce qui précède seront-elles différentes en cas d'application autonome?Comment définir mon chargeur de classe personnalisée comme valeur par défaut?

Merci!

Répondre

12

Vous pouvez définir le chargeur de classe par défaut du système comme argument JVM:

java -Djava.system.class.loader 
    =com.test.YourCustomClassLoader com.test.YourMainClass 

Comme Tomcat démarre comme une application java, vous pouvez définir ce paramètre aussi, à l'exécutable %TOMCAT_HOME%\bin\run.bat ou $TOMCAT_HOME/bin/run.sh.

Modifier exécution: Si vous définissez votre classloader comme de système chargeur de classe, il sera utilisé pour charger des classes de composants Tomcat, les différentes bibliothèques, et vos propres classes. Si vous souhaitez que votre chargeur de classe soit utilisé uniquement pour vos classes d'application (y compris les bibliothèques, etc.), vous devez configurer un élément Loader pour votre contexte. L'élément Loader doit être défini à l'intérieur de votre élément Context, qui peut être défini dans un fichier context.xml. Plus d'informations:

+0

Pour une raison quelconque, il m'a java.lang.Error: java.lang.IllegalStateException: invocation récursive. C'est ce que j'ai fait: sous-classer ClassLoader, fournir c'tor qui prend un ClassLoader comme paramètre, le configurer en utilisant -Djava.system.class.loader, et ... Boom! Une erreur est survenue lors de l'initialisation de la machine virtuelle :-(Ai-je manqué quelque chose? – Seffy

+0

Sans une vue sur votre code, je ne peux pas vous dire à coup sûr. –

+0

Je l'ai testé avec une petite application principale que je l'ai, et il est géré OK. –

Questions connexes