[JAVA] Ich habe zum ersten Mal seit einiger Zeit einen DB-Suchprozess in Rails geschrieben und untersucht, wie eine Datumsvergleichssuche geschrieben wird. Deshalb habe ich ein Memo geschrieben. Die meiste Zeit, wenn ich nach etwas anderem suchte, wie SQL schreiben oder Arel verwenden, konnte ich es wie folgt schreiben. Das Gegenteil ist wahr. So verhindern Sie Konflikte zwischen Ruby, dem Rails JBoss-Modul und der Anwendungsbibliothek

Bestätigungsumgebung

JBoss EAP 6.4.0, 7.0.0, 7.1.0beta1

Ursachen für Modul- und Bibliothekskonflikte

Bei der Verwendung von JBoss EAP (JBoss) als Java EE-Anwendungsserver ist ein Konflikt zwischen Bibliotheken und Modulen zu beachten. Weitere Informationen finden Sie in Kapitel 3 Laden und Modulen von Klassen im Entwicklungshandbuch, jedoch kurz. In JBoss werden die in JBoss enthaltenen Module bevorzugt in die Anwendungsbibliothek geladen. (Es scheint keine Einstellung zu geben, um die Reihenfolge der Gefühle zu ändern, die Sie kurz sehen.)

Dies bedeutet, dass Ihre Anwendung möglicherweise auf einer anderen Version ** ausgeführt wird ** als die Version der Bibliothek, die Sie zum Zeitpunkt der Erstellung verwendet haben. Dies kann zu Fehlern beim Start und zur Laufzeit führen. (Es ist jetzt in Ordnung, aber beim Upgrade können Probleme auftreten: gequält :)

Wissen, welche Module geladen werden

JBoss-Module werden je nach Bereitstellung automatisch geladen. Versuchen Sie daher, die Anwendung, die Sie ausführen möchten, einmal bereitzustellen, und ermitteln Sie, was geladen wird.

Wenn dies die Standardeinstellung von "standalone.xml" in "{JBOSS_HOME} / standalone / configuration" ist, gibt es eine Einstellung für die Protokollausgabe in der 115. Zeile. Ändern Sie daher die Ebene in "DEBUG".

standalone.xml


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

Starten Sie in diesem Status JBoss und versuchen Sie, eine beliebige Anwendung bereitzustellen. Anschließend wird eine Liste der von JBoss geladenen Anwendungsbibliotheken und Module in "{JBOSS_HOME} / standalone / server.log" ausgegeben. Der Teil, der besagt, dass Ressourcen hinzugefügt werden, ist die aus dem Krieg geladene Bibliothek. Hinzufügen eines Abhängigkeitsmoduls Der Teil mit der Bezeichnung Abhängigkeit ist das geladene Modul. Das Folgende ist eine Beispielausgabe.

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

Lassen Sie uns diesmal javax.ejb.api als Beispiel ausschließen.

Erstellen einer Konfigurationsdatei für das Modul

Platzieren Sie "jboss-deploy-struct.xml" direkt unter WEB-INF der Webanwendung. Stellen Sie es nach dem Platzieren wie folgt ein.

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>

Fügen Sie einfach die ausgeschlossenen Module in "<Ausschlüsse>" ein. Sie müssen es aus dem Pfad angeben, der in der module.xml jedes Moduls geschrieben ist. Lassen Sie uns jetzt JBoss in diesem Zustand neu starten.

Ich werde es weglassen, weil das Protokoll lang ist, aber es sollte kein "javax.ejb.api" in der Spalte "Abhängigkeitsmodul hinzufügen" enthalten sein.

Andere Einstellungen

Sie können Module, die ursprünglich nicht in JBoss enthalten waren, zu "jboss-deploy-struct.xml" hinzufügen oder jedes Subsystem ausschließen, das aus mehreren Modulen besteht. Obwohl hier nicht behandelt, wird die Einstellungsmethode in Kapitel 3 des Entwicklungshandbuchs beschrieben. Bitte beziehen Sie sich darauf.

Hintergrund zu diesem Beitrag

Es fiel mir schwer, die Fehlerursache nicht zu kennen, wenn die Anwendung, die mit Tomcat einwandfrei funktioniert, JBoss ist: dizzy_face:

Bonus

Sonderfall

Ich war besorgt darüber, ob ich dies als Hauptschreiben schreiben sollte, aber es ging nicht nur darum, Module auszuschließen, sondern als Bonus ... Erstellen Sie ein leeres Projekt von TERASOLUNA (5.3.0) und fügen Sie Folgendes in HelloController.java ein Code hinzufügen.

HelloController.java



/** (Abkürzung**/
import com.fasterxml.jackson.databind.util.StdDateFormat;

	/** (Abkürzung**/

	@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);

		//von hier
		Set<DateFormat> set = new HashSet<>();
		set.add(StdDateFormat.instance);
		//Bisher

		model.addAttribute("serverTime", formattedDate);

		return "welcome/home";
	}
}

Stellen Sie dies auf dem in STS enthaltenen Pivotal tc Server (v3.2) bereit und greifen Sie auf [http: // localhost: 8080 / todo](http: // localhost: 8080 / todo) zu.

pivotal_result.PNG

Es gibt kein besonderes Problem. Lassen Sie uns nun JBoss EAP 7.0.0 bereitstellen und darauf zugreifen.

jboss7_result.PNG

Ich habe einen Fehler bekommen. Es liegt auch ein Fehler in der Konsole vor.

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)
	(Abkürzung)

Die 38. Zeile von HelloController.java ist der Teil von set.add (StdDateFormat.instance);.

Dieser Fehler wurde bereits in 2.7.2 von jackson-database [gemeldet] behoben (https://github.com/FasterXML/jackson-databind/issues/1130). Die von TERASOLUNA 5.3.0 verwendete Version von jackson-database ist 2.8 (siehe [Stapelliste]) (http://terasolunaorg.github.io/guideline/5.3.0.RELEASE/ja/Overview/FrameworkStack.html). Es ist .5, warum ist das passiert?

Das liegt daran, dass die in JBoss EAP 7.0.0 enthaltene Version von Jackson-Databind 2.5.4 ist ... aber weil mehrere Module voneinander abhängig sind und das einfache Ausschließen von Jackson-Databind nicht funktioniert, also sub System JAX-RS ausschließen.

Referenz: Wildfly 9 - Wie schließe ich Jackson aus

Stellen Sie jboss-deploy-struct.xml wie folgt ein.

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>

Lassen Sie uns jetzt JBoss in diesem Zustand neu starten.

jboss7_result.PNG

Ich habe es getan ☆

Recommended Posts

Ich habe zum ersten Mal seit einiger Zeit einen DB-Suchprozess in Rails geschrieben und untersucht, wie eine Datumsvergleichssuche geschrieben wird. Deshalb habe ich ein Memo geschrieben. Die meiste Zeit, wenn ich nach etwas anderem suchte, wie SQL schreiben oder Arel verwenden, konnte ich es wie folgt schreiben. Das Gegenteil ist wahr. So verhindern Sie Konflikte zwischen Ruby, dem Rails JBoss-Modul und der Anwendungsbibliothek
Ruby So konvertieren Sie zwischen Groß- und Kleinschreibung
Unterschied zwischen Java und JavaScript (wie man den Durchschnitt findet)
[Rails] Verschiedene Unterschiede zwischen redirect_to und Render-Methode und Ausgabemethode der Render-Methode
Unterschiede im Umgang mit Zeichenfolgen zwischen Java und Perl
So wechseln Sie in Netty dynamisch zwischen FIN und RST
So synchronisieren Sie Kundendaten zwischen Salesforce und Kintone (Java-Simple JDBC)
Verwendung von EventBus3 und ThreadMode
[Schienen] So verhindern Sie den Bildschirmübergang
Aufrufen von Klassen und Methoden
Wie man Gleichheit und Gleichheit benutzt (wie man Gleichheit benutzt)
So verbinden Sie Heroku und Sequel
So konvertieren Sie LocalDate und Timestamp
So rufen Sie Bibliotheken wie JQuery und JQuery UI in Liferay 7 / DXP auf
So verhindern Sie die doppelte Verarbeitung durch addEventListener
Verwendung von OrientJS und OrientDB zusammen
So erkennen Sie Mikrofonkonflikte unter Android
Schritte zum Veröffentlichen einer Anwendung auf Heroku
[Java] Wie man Dateien ausgibt und schreibt!
So richten Sie kapt ein und verwenden es
Wie man SquashTM baut und wie man Japanisch unterstützt
Wie man die Zehner und Einsen findet
[Einfach] So aktualisieren Sie Ruby und Bundler
Verwendung von Teilzeichenfolgen und Substratmethoden
[Struts] So übergeben Sie Werte zwischen jsps
Hinzufügen von Informationen zur Anwendungsversion zu Sentry-Informationen
So wechseln Sie zwischen mehreren Java-Versionen
Verwendung von @Builder und @NoArgsConstructor zusammen
Unterschied zwischen Java, C # und JavaScript (wie man den Grad der Fettleibigkeit findet)
So ermitteln Sie den Abstand und den Winkel zwischen zwei Punkten in einer Ebene