2015-09-24 1 views
1

Description de la structure d'application: Application d'oreille avec module ejb (.jar), jboss-seam (.jar) et module de guerre (.war).Jboss 7 getResourcesAsStream()

J'ai un StartupAction.class (composant de joint) annoté avec org.jboss.seam.annotations.Startup. Au cours du déploiement de l'application que je dois obtenir la ressource de la racine du module application.war (application.war/pages/page.xhtml) et WEB-INF/classes (application.war/WEB-INF/classes/file.properties)

  • Jboss 4.2 Thread.currentThread().getContextClassLoader().getResourceAsStream("file.properties") aurait récupérer le fichier de application.war/WEB-INF/classes/file.properties.

  • Jboss
    7.1.1 code de ci-dessus ne fonctionne pas avec Jboss 7.

Je sais que le chargement des classes a changé, mais je ne peux pas comprendre comment obtenir en application.war dans jboss 7.

Est-il possible de le faire? Y a-t-il un exemple de cela?

Merci d'avance.

+0

Où se trouve exactement 'StartupAction'? Le module EAR/EJB est en premier lieu jamais supposé pouvoir accéder aux ressources de WAR ni utiliser ses dépendances. C'est seulement l'inverse. – BalusC

+0

'StartupAction' est dans application.jar dans _company .... action_ package. Toutes les classes sont là.Au démarrage, il appelle un StartupService qui est responsable de l'extraction du fichier et de l'importation des propriétés dans la base de données. Je migre l'application seam de jboss 4 vers jboss 7. S'il y a une autre façon de le faire (obtenir un fichier au démarrage), je pourrais le ré-implémenter. – jzoric

+0

Dans le module EAR/EJB. – jzoric

Répondre

2

Comme mentionné par @BalusC, vous ne pourrez pas lire un propriétés fichier incorporé dans un module Web à partir de tout autre module (EJB ou autre) contenu dans votre fichier EAR.

Le fait que cela fonctionne dans JBoss 4.x est une conséquence de la rétrocompatibilité avec les versions antérieures de JBoss. Une configuration supplémentaire est requise dans JBoss 4.x pour pouvoir utiliser le chargement de classe conforme aux spécifications. JBoss 7.x et les versions plus récentes utilisent le chargement de classe conforme aux spécifications par défaut.

Si votre fichier de propriétés contient une configuration externe destinée à être accessible après le déploiement, vous pouvez envisager l'approche décrite dans How to put an external file in the classpath. Toutefois, s'il s'agit effectivement de données statiques, vous devez empaqueter le fichier de propriétés dans un module jar et le placer dans le répertoire lib de votre fichier EAR.

+0

J'ai empaqueté mes propriétés dans le fichier jar et l'ai déplacé dans le dossier application.ear/lib. Dans le code 'StartupAction'' Thread.currentThread(). GetContextClassLoader(). GetResourceAsStream (file.properties) 'fonctionne maintenant. Je crois que ce sera une solution acceptable. – jzoric

0

Dans jboss7, vous avez un chargeur de classe pour chaque sous-déploiement.

Dans votre cas, Thread.currentThread().getContextClassLoader() renverra le chargeur de classe du déploiement en cours.

Pour résoudre votre problème, vous pouvez essayer ceci: SomeRandomClassContainedInsideTheWAR.class.getClassLoader()

Vérifiez ce guide pour en savoir plus sur JBoss7 ClassLoader https://docs.jboss.org/author/display/AS7/Class+Loading+in+AS7

+0

Le problème est que je n'ai pas de cours en guerre. Toutes mes classes sont dans le module application-ejb.jar. J'ai une classe dans le module de guerre qui n'est pas utilisée et j'ai essayé là SomeRandomClassContainedInsideTheWAR.class.getClassLoader(). GetResources (...) ne fonctionnait pas. Il renvoie null. – jzoric

+0

Avez-vous essayé avec '" /file.properties "', ou '" /WEB-INF/classes/file.properties "' au lieu de "file.properties"? – Ozwizard

+0

Oui. Renvoie 'null'. – jzoric