J'ai une bibliothèque qui est fournie en tant que fichier JAR exécutable et ajouté à Weblogic / Tomcat ClassPath, comment puis-je exécuter une méthode principale à partir du fichier JAR lorsque le serveur démarre et chargez les classes du fichier JAR. p>
Ce que je veux, c'est que le code d'initialisation doit être exécuté de première fois lorsque le fichier JAR est chargé et que le serveur commence sans aucune intervention de l'utilisateur. P>
Remarque: Je sais que je peux regrouper mon pot dans un fichier de guerre, mais j'ai un code de AspectJ dans ma bibliothèque que je souhaite tisser toutes les applications en cours d'exécution dans la JVM, lorsque je baisse mon jar dans le fichier de guerre, le code de Aspectj Va seulement tisser dans les classes dans le fichier de guerre, donc j'ai ajouté mon fichier jar de bibliothèque dans la classe de classe. p>
Merci d'avance. P>
4 Réponses :
Peut-être la chose la plus simple à faire est de déployer un servlet trivial dans un fichier .war qui fait référence à votre fichier .jar. Le servlet peut être configuré pour démarrage lors du démarrage de déploiement / conteneur , puis il em> peut invoquer la classe contenant votre MAIN () code> méthode. P>
J'ai un code de AspectJ dans ma bibliothèque que je souhaite tisser toutes les applications en cours d'exécution dans la JVM, lorsque je baisse mon jar dans le fichier de guerre, le code de Aspectj ne tire que dans les classes du fichier de guerre.
Devinez cette méthode ne fonctionnera pas, car elle n'ignore pas les classes mondiales ou les classes dans d'autres fichiers de guerre. S'il vous plaît voir ma solution ci-dessous si elle convient.
Lorsque les serveurs d'applications / conteneurs de servlet ont généralement beaucoup de chargeurs de classe différents, vous aurez probablement besoin d'une stratégie différente pour le tissage des aspects dans votre code que dans des applications autonomes. P>
Je recommanderais d'ajouter les aspects à chaque fichier de guerre déployé au moment de la construction. Cela peut suivre une technique commune - par opposition à un serveur spécifique un. P>
En outre, je ne suis pas sûr qu'il puisse réellement être fait (correctement et pris en charge) sur un serveur. Typiquement, un serveur est conçu pour séparer toutes les webapps les uns des autres. Vous pouvez le faire fonctionner, mais cela pourrait casser la prochaine mise à jour du serveur. p>
Il pourrait être plus facile de suggérer une technique alternative si vous indiquez le problème que vous souhaitez résoudre avec votre approche proposée. P>
Modifier après votre commentaire: Considérez le cycle de vie de l'application Web standard: vous pouvez exécuter du code, par exemple. Dans un servlet, il est déployé. Si vous insistez sur votre code contenu dans Main code>, vous pouvez appeler cette méthode à partir du code d'initialisation de votre WebApp. P>
Je rédige un outil de surveillance des performances personnalisé à nos besoins commerciaux et j'aimerais pouvoir surveiller toutes les applications déployées sans avoir à inclure le pot dans chaque fichier de guerre, jusqu'à présent, il fonctionne bien en regroupant tous les aspects et les besoins nécessaires. Dépendances Dans un fichier JAR et l'ajoutant au parcours du serveur (Weblogic et Tomcat pour l'instant), je suis capable de tisser dans toutes les applications déployées sur la JVM. mais j'ai toujours besoin d'exécuter du code d'initialisation du fichier JAR lorsqu'il est chargé, sans avoir à modifier les autres applications.
... de sorte que l'intention de la question est de disposer du code d'initialisation qui exécute du pot pour effectuer l'initialisation nécessaire aux aspects.
La seule question avec l'approche proposée est que le pot avec l'aspect est censé être chargé avant toute application Web, appelant ainsi la méthode principale du servlet pourrait être trop tard.
Ajoutez une classe à l'intérieur de votre pot avec le code suivant:
There are three aspects of a class loader behavior Lazy Loading Class Caching Separate Namespaces
Existe-t-il une solution globale qui fonctionne sur tous les serveurs d'applications qui ne sont pas spécifiques à Tomcat?
Nan. Oracle a ses propres auditeurs APEX et, de la même manière, chaque serveur a ses propres auditeurs. J2EE définit uniquement les auditeurs pour un contexte Web spécifique, il ne spécifie pas les auditeurs pour un serveur entier. Donc, chaque serveur a sa propre façon d'écouter des événements à l'échelle du serveur.
Si vous créez un pot, alors la façon dont les autres bibliothèques le font: ont deux pots b>. L'un est votre pot principal. Deuxièmement, un jar à écouter spécifique au serveur i>, qui vient d'avoir la classe d'auditeur. par exemple. Pour Tomcat, vous auriez le code ci-dessus dans un YourApp-tomcat.jar code>, et pour oracle, vous auriez un code différent dans
YourApp-oracle.jar code>. Laissez ensuite les utilisateurs d'utiliser le pot d'écouteurs supplémentaire qui correspond au serveur d'applications qu'elles utilisent.
Vous devez enregistrer un agent Java. Voir ce lien: Java.lang.Indument . p>
C'est la bonne façon de le faire. P> java.lang.instrument code> fournit des services permettant aux agents linguistiques de la programmation Java aux programmes d'instruments exécutés sur la JVM. P>