[JAVA] Comment éviter les conflits entre les modules JBoss et les bibliothèques d'applications

Environnement de confirmation

JBoss EAP 6.4.0, 7.0.0, 7.1.0beta1

Causes des conflits de modules et de bibliothèques

Lorsque vous utilisez JBoss EAP (ci-après JBoss) en tant que serveur d'applications Java EE, il y a un conflit entre les bibliothèques et les modules. Plus de détails peuvent être trouvés dans Chapitre 3 Chargement de classes et modules dans le Guide de développement, mais brièvement. Dans JBoss, les modules inclus dans JBoss sont chargés de préférence à la bibliothèque d'application. (Il ne semble y avoir aucun paramètre pour changer l'ordre des sentiments que vous voyez brièvement.)

Cela signifie que votre application peut s'exécuter sur une version ** différente ** de la version de la bibliothèque que vous avez utilisée au moment de la construction, ce qui peut entraîner des erreurs au démarrage et à l'exécution. (Ça va maintenant, mais des problèmes peuvent survenir lors de la mise à niveau: angoissé :)

Sachez quels modules seront chargés

Les modules JBoss sont automatiquement chargés en fonction de ce que vous déployez, essayez donc de déployer l'application que vous souhaitez exécuter une fois pour voir ce qui est chargé.

Si c'est la valeur par défaut de standalone.xml dans {JBOSS_HOME} / standalone / configuration, il y a un paramètre lié à la sortie du journal sur la 115e ligne, alors changez le niveau en DEBUG.

standalone.xml


  <root-logger>
   <level name="DEBUG"/>
   <handlers>
    <handler name="CONSOLE"/>
    <handler name="FILE"/>
   </handlers>
  </root-logger>

Dans cet état, démarrez JBoss et essayez de déployer n'importe quelle application. Ensuite, une liste des bibliothèques d'application et des modules chargés par JBoss est sortie dans {JBOSS_HOME} / standalone / server.log. La partie qui dit Ajouter une ressource est la bibliothèque chargée depuis war, Ajout d'un module de dépendance La partie intitulée Dependency est le module chargé. Voici un exemple de sortie.

server.log


2017-09-04 18:29:42,597 DEBUG [org.jboss.as.server.deployment](MSC service thread 1-7) Adding resource "/C:/jboss/standalone/deployments/todo.war/WEB-INF/lib/aopalliance-1.0.jar" to module deployment.todo.war
2017-09-04 18:29:42,648 DEBUG [org.jboss.as.server.deployment](MSC service thread 1-7) Adding dependency ModuleDependency [identifier=javax.ejb.api, moduleLoader=local module loader @282ba1e (finder: local module finder @13b6d03 (roots: C:\jboss\modules,C:\jboss\modules\system\layers\base)), export=false, optional=false, importServices=true] to module deployment.todo.war

Cette fois, excluons javax.ejb.api comme exemple.

Création d'un fichier de configuration pour le module

Placez jboss-deployment-structure.xml directement sous WEB-INF de l'application Web. Après l'avoir placé, réglez comme suit.

jboss-deployment-structure.xml


<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
	<deployment>
		<exclusions>
			<module name="javax.ejb.api" />
		</exclusions>
	</deployment>
</jboss-deployment-structure>

Mettez simplement les modules exclus dans <exclusions> ''. Vous devez le spécifier à partir du chemin, qui est écrit dans le module.xml` de chaque module. Maintenant, redémarrons JBoss dans cet état.

Je vais l'omettre car le journal est long, mais il ne devrait pas y avoir de javax.ejb.api dans la colonne Adding dependency Module Dependency.

Autres réglages

Vous pouvez ajouter des modules qui ne sont pas initialement inclus dans JBoss à jboss-deployment-structure.xml, ou exclure chaque sous-système qui se compose de plusieurs modules. Bien qu'elle ne soit pas abordée ici, la méthode de paramétrage est décrite au chapitre 3 du Guide de développement, veuillez donc vous y référer.

Contexte de cet article

J'ai eu du mal à ne pas connaître la cause de l'erreur si l'application qui fonctionne bien avec Tomcat est JBoss: dizzy_face:

prime

Cas spécifique

Je m'inquiétais de savoir s'il fallait écrire ceci comme principal, mais ce n'était pas seulement une question d'exclusion de modules, donc en prime ... Créez un Projet vide de TERASOLUNA (5.3.0) et mettez ce qui suit dans HelloController.java Ajoutez du code.

HelloController.java



/** (Abréviation**/
import com.fasterxml.jackson.databind.util.StdDateFormat;

	/** (Abréviation**/

	@RequestMapping(value = "/", method = { RequestMethod.GET, RequestMethod.POST })
	public String home(Locale locale, Model model) {
		logger.info("Welcome home! The client locale is {}.", locale);

		Date date = new Date();
		DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
		String formattedDate = dateFormat.format(date);

		//d'ici
		Set<DateFormat> set = new HashSet<>();
		set.add(StdDateFormat.instance);
		//Jusque là

		model.addAttribute("serverTime", formattedDate);

		return "welcome/home";
	}
}

Déployez-le sur le serveur Pivotal tc (v3.2) inclus avec STS et accédez à [http: // localhost: 8080 / todo](http: // localhost: 8080 / todo).

pivotal_result.PNG

Il n'y a pas de problème particulier. Maintenant, déployons et accédons à JBoss EAP 7.0.0.

jboss7_result.PNG

J'ai une erreur. Il y a également une erreur sur la console.

console.log


15:28:42,923 ERROR [org.terasoluna.gfw.common.exception.ExceptionLogger](default task-2) [e.xx.fw.9001] UNDEFINED-MESSAGE: java.lang.NullPointerException
	at java.text.DateFormat.hashCode(Unknown Source)
	at java.util.HashMap.hash(Unknown Source)
	at java.util.HashMap.put(Unknown Source)
	at java.util.HashSet.add(Unknown Source)
	at todo.app.welcome.HelloController.home(HelloController.java:38)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	(Abréviation)

La 38ème ligne de HelloController.java fait partie de set.add (StdDateFormat.instance);.

Cette erreur a déjà été corrigée dans 2.7.2 de jackson-databind signalé. La version de jackson-databind utilisée par TERASOLUNA 5.3.0 est la 2.8 comme indiqué dans la Stack List. C'est 0,5, pourquoi est-ce arrivé?

C'est parce que la version de jackson-databind incluse dans JBoss EAP 7.0.0 est 2.5.4 ... mais parce que plusieurs modules sont dépendants les uns des autres et excluant simplement jackson-databind ne fonctionne pas, donc sous Exclure le système JAX-RS.

Référence: Wildfly 9 - Comment exclure Jackson

Définissez jboss-deployment-structure.xml comme suit.

jboss-deployment-structure.xml


<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
	<deployment>
		<exclude-subsystems>
			<subsystem name="jaxrs" />
		</exclude-subsystems>
	</deployment>
</jboss-deployment-structure>

Maintenant, redémarrons JBoss dans cet état.

jboss7_result.PNG

Je l'ai fait ☆

Recommended Posts

Comment éviter les conflits entre les modules JBoss et les bibliothèques d'applications
Ruby Comment convertir entre les majuscules et les minuscules
Différence entre Java et JavaScript (comment trouver la moyenne)
[Rails] Différentes différences entre redirect_to et méthode de rendu et méthode de sortie de la méthode de rendu
Différences dans la gestion des chaînes entre Java et Perl
Comment basculer dynamiquement entre FIN et RST dans Netty
Comment synchroniser les données client entre Salesforce et Kintone (Java-Simple JDBC)
Comment utiliser EventBus3 et ThreadMode
[Rails] Comment empêcher la transition d'écran
Comment appeler des classes et des méthodes
Comment utiliser l'égalité et l'égalité (comment utiliser l'égalité)
Comment connecter Heroku et Sequel
Comment convertir LocalDate et Timestamp
Comment appeler des bibliothèques telles que JQuery et JQuery UI dans Liferay 7 / DXP
Comment éviter le traitement en double par addEventListener
Comment utiliser OrientJS et OrientDB ensemble
Comment détecter les conflits de microphone sur Android
Étapes pour publier une application sur Heroku
[Java] Comment sortir et écrire des fichiers!
Comment configurer et utiliser kapt
Comment créer SquashTM et comment prendre en charge le japonais
Comment trouver les dizaines et les unités
[Facile] Comment mettre à niveau Ruby et le bundler
Comment utiliser les méthodes substring et substr
[Struts] Comment passer des valeurs entre jsps
Comment ajouter des informations sur la version de l'application aux informations Sentry
Comment basculer entre plusieurs versions de Java
Comment utiliser @Builder et @NoArgsConstructor ensemble
Différence entre Java, C # et JavaScript (comment trouver le degré d'obésité)
Comment trouver la distance et l'angle entre deux points sur un plan