2009-05-24 6 views
2

J'ai une application web et deux fichiers de classe,Quelle classe serait chargée en premier lors du démarrage de l'application Web?

La première classe est MyClass.class qui se trouve dans le fichier abc.jar (WEB-INF/lib/abc.jar) et classe second est YourClass .class qui se trouve dans le dossier classes (WEB-INF/classes/YourClass.class).

Ma question est de savoir quelle classe serait chargée en premier au démarrage de l'application? Et pourquoi ?

Répondre

9

Dans mon expérience, vous ne pouvez pas prédire l'ordre dans lequel les classes sont chargées par la JVM. Une fois que j'ai fait un coureur de test (un peu Surefire de Maven) et avec la même JVM et OS, il a chargé les classes dans un ordre différent lorsqu'il était exécuté sur des machines différentes. La leçon apprise:

Vous ne devriez pas construire vos applications à dépendre de l'ordre de chargement de classe

+3

+1 - Excellent point, bien écrit. – duffymo

3

Sun class loader docs de Sun toujours dire WEB-INF/classes OU WEB-INF/lib, mais ne dit pas lequel sera vérifié en premier.

De IBM docs:

« Les règles pour les classes de chargement sont énoncées en détail dans la spécification JVM Le principe de base est que classes sont chargés uniquement nécessaire (ou au moins semblent être chargé. de cette façon, la JVM a une certaine flexibilité dans le chargement réel, mais doit maintenir une séquence fixe d'initialisation de classe.) Chaque classe chargée peut avoir d'autres classes dont elle dépend, donc le processus de chargement est récursif.

Donc je pense que la réponse est: Cela dépend des classes qui sont nécessaires dans votre application en premier.

1

Comme duffymo souligne, cela peut varier. Une façon de déterminer la séquence de cette application spécifique consiste à insérer le texte Response.Write dans les méthodes de chargement des pages Web des constructeurs de classe et des applications Web. "Objet instancié dans la classe A", "page Web ouverte MyPage", et ainsi de suite. Une fois que vous avez trouvé la séquence, mettez en commentaire le code de ceux-ci afin de pouvoir les réutiliser plus tard pour vérifier que vous n'avez pas modifié (comme l'instanciation d'un objet plus tôt ou plus tard) affectant la séquence.

5

Les classes sont chargées selon les besoins, pour une définition de «nécessaire». Exactement quand une classe est chargée dépend de l'implémentation de JRE, l'implémentation de javac, exactement ce que le thread est à la hauteur, le code du serveur et, bien sûr, le code de l'application. C'est une mauvaise idée de faire des suppositions dans ce domaine. Si vous voulez voir ce qui se passe pour une course particulière, vous pouvez utiliser -verbose:class

Questions connexes