So starten Sie das Quellcode-Debugging von Tomcat in Idea und rufen Tomcat zum Debuggen auf

So starten Sie das Quellcode-Debugging von Tomcat in Idea und rufen Tomcat zum Debuggen auf

Wenn Sie das Idea-Entwicklungstool zum Debuggen von Code verwenden und es sich um ein Java-Webprojekt handelt, das Tomcat als Webcontainer verwendet, kann beim Debug-Tracing mit Haltepunkten das Paket org.apache.catalina nicht aufgerufen werden. Dies liegt daran, dass der in Idea ausgeführte Tomcat über ein Plug-In integriert ist und das Lib-Paket in Tomcat nicht mehr im Abhängigkeitspfad des Projekts enthalten ist, sodass es nicht verfolgt werden kann.

Markieren Sie zunächst einen Haltepunkt in der von Tomcat zurückgerufenen Schnittstellenimplementierungsklasse in Ihrem eigenen Projekt und starten Sie das Webprojekt über die Idee. Wenn die in der Abbildung gezeigten Haltepunktinformationen angezeigt werden, ist der Aufrufstapel ein interner Code von Tomcat, da die Haltepunktposition die von Tomcat zurückgerufene Schnittstellenklasse markiert. Ein Doppelklick auf den Klassennamen unter dem Paket org.apache.catalina reagiert jedoch zu diesem Zeitpunkt nicht, da wir die Tomcat entsprechenden Abhängigkeitsdateien nicht zum Klassenpfad hinzugefügt haben.

Abhängigkeiten hinzufügen

<Abhängigkeit>
 <groupId>org.apache.tomcat</groupId>
 <artifactId>Tomcat-Catalina</artifactId>
 <version>8.5.55</version>
 <scope>bereitgestellt</scope>
</Abhängigkeit>

Da die JAR-Datei im Lib-Verzeichnis von Tomcat zur Laufzeit verwendet wird, verwendet der Bereich hier die bereitgestellte Methode

Jetzt können Sie den Tomcat-Quellcode-Debugging-Befehl eingeben.

Wie wird das Tomcat-Startprotokoll ausgedruckt?

03. Juni 2020 10:31:30.929 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server. Serverversion: Apache Tomcat/8.5.55
03.06.2020 10:31:30.938 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server-Build: 5. Mai 2020 22:10:54 UTC
03.06.2020 10:31:30.938 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Serverversionsnummer (: 8.5.55.0
03-Jun-2020 10:31:30.938 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Betriebssystemname: Windows 10
03. Juni 2020 10:31:30.938 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS.Version: 10.0
03.06.2020 10:31:30.938 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Architektur: amd64
03.06.2020 10:31:30.939 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Java-Umgebungsvariable: C:\Programme\Java\jdk1.8.0_212\jre
03.06.2020 10:31:30.939 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Java-Virtual-Machine-Version: 1.8.0_212-b10
03. Juni 2020 10:31:30.939 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM.Anbieter: Oracle Corporation
03.06.2020 10:31:30.939 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE: C:\Benutzer\Administrator\.IntelliJIdea2018.3\system\tomcat\Unnamed_spring-shiro-training
03. Juni 2020 10:31:30.939 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME: D:\tomcat8.5.55\apache-tomcat-8.5.55

Durch Auffinden des VersionLoggerListener-Protokolls können Sie

private void log() {
 log.info(sm.getString("versionLoggerListener.serverInfo.server.version",
  ServerInfo.getServerInfo()));
 log.info(sm.getString("versionLoggerListener.serverInfo.server.built",
  ServerInfo.getServerBuilt()));
 log.info(sm.getString("versionLoggerListener.serverInfo.server.number",
  ServerInfo.getServerNumber()));
 log.info(sm.getString("versionLoggerListener.os.name",
  System.getProperty("os.name")));
 log.info(sm.getString("versionLoggerListener.os.version",
  System.getProperty("os.version")));
 log.info(sm.getString("versionLoggerListener.os.arch",
  System.getProperty("os.arch")));
 log.info(sm.getString("versionLoggerListener.java.home",
  System.getProperty("java.home")));
 log.info(sm.getString("versionLoggerListener.vm.version",
  System.getProperty("java.runtime.version")));
 log.info(sm.getString("versionLoggerListener.vm.vendor",
  System.getProperty("java.vm.vendor")));
 log.info(sm.getString("versionLoggerListener.catalina.base",
  System.getProperty("catalina.base")));
 log.info(sm.getString("versionLoggerListener.catalina.home",
  System.getProperty("catalina.home")));


 wenn (logArgs) {
 List<String> args = ManagementFactory.getRuntimeMXBean().getInputArguments();
 für (String arg : args) {
  log.info(sm.getString("versionLoggerListener.arg", arg));
 }
 }


 wenn (logEnv) {
 SortedMap<String, String> sortedMap = neue TreeMap<>(System.getenv());
 für (Map.Entry<String, String> e : sortedMap.entrySet()) {
  log.info(sm.getString("versionLoggerListener.env", e.getKey(), e.getValue()));
 }
 }


 wenn (logProps) {
 SortedMap<String, String> sortedMap = neue TreeMap<>();
 für (Map.Entry<Object, Object> e : System.getProperties().entrySet()) {
  sortedMap.put(String.valueOf(z.B. getKey()), String.valueOf(z.B. getValue()));
 }
 für (Map.Entry<String, String> e : sortedMap.entrySet()) {
  log.info(sm.getString("versionLoggerListener.prop", e.getKey(), e.getValue()));
 }
 }
}

Die Entdeckung erfolgt durch Schlüssel-Wert-Paare und dann durch globale String-Suche

Bildbeschreibung hier einfügen

Aber die Übereinstimmung ist Englisch. Wie geben Sie also Chinesisch ein?

Schließlich habe ich durch Debuggen Folgendes gefunden

Bildbeschreibung hier einfügen

Ähnlich wie oben habe ich beim Debuggen festgestellt, dass immer noch ziemlich viele Dinge von tocmat gestartet werden. Sehen Sie sich das Folgende an

Bildbeschreibung hier einfügen

Daten nach dem Start von Idea Tomcat

03.06.2020 10:31:30.939 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Befehlszeilenargumente: -Djava.util.logging.config.file=C:\Users\Administrator\.IntelliJIdea2018.3\system\tomcat\Unnamed_spring-shiro-training\conf\logging.properties
03.06.2020 10:31:30.940 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Befehlszeilenargumente: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
03.06.2020 10:31:30.940 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Befehlszeilenargumente: -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:52290,suspend=y,server=n
03.06.2020 10:31:30.940 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Befehlszeilenargumente: -javaagent:C:\Users\Administrator\.IntelliJIdea2018.3\system\captureAgent\debugger-agent.jar
03.06.2020 10:31:30.940 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Befehlszeilenargument: -Dfile.encoding=UTF-8
03.06.2020 10:31:30.940 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Befehlszeilenargument: -Dcom.sun.management.jmxremote=
03.06.2020 10:31:30.940 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Befehlszeilenargument: -Dcom.sun.management.jmxremote.port=1099
03.06.2020 10:31:30.940 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Befehlszeilenargument: -Dcom.sun.management.jmxremote.ssl=false
03.06.2020 10:31:30.940 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Befehlszeilenargumente: -Dcom.sun.management.jmxremote.password.file=C:\Users\Administrator\.IntelliJIdea2018.3\system\tomcat\Unnamed_spring-shiro-training\jmxremote.password
03.06.2020 10:31:30.940 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Befehlszeilenargument: -Dcom.sun.management.jmxremote.access.file=C:\Users\Administrator\.IntelliJIdea2018.3\system\tomcat\Unnamed_spring-shiro-training\jmxremote.access
03.06.2020 10:31:30.940 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Befehlszeilenargumente: -Djava.rmi.server.hostname=127.0.0.1
03.06.2020 10:31:30.940 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Befehlszeilenargument: -Djdk.tls.ephemeralDHKeySize=2048
03.06.2020 10:31:30.940 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Befehlszeilenargumente: -Djava.protocol.handler.pkgs=org.apache.catalina.webresources
03.06.2020 10:31:30.941 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Befehlszeilenargument: -Dignore.endorsed.dirs=
03.06.2020 10:31:30.941 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Befehlszeilenargumente: -Dcatalina.base=C:\Benutzer\Administrator\.IntelliJIdea2018.3\system\tomcat\Unnamed_spring-shiro-training
03.06.2020 10:31:30.941 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Befehlszeilenargument: -Dcatalina.home=D:\tomcat8.5.55\apache-tomcat-8.5.55
03.06.2020 10:31:30.941 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Befehlszeilenargument: -Djava.io.tmpdir=D:\tomcat8.5.55\apache-tomcat-8.5.55\temp

Das Obige ist nur die grundlegende Umgebungskonfiguration. Danach ist es bereit für die Verknüpfung mit dem Tomcat-Dienst.

03.06.2020 10:31:30.941 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent Geladene APR-basierte native Apache Tomcat-Bibliothek [1.2.24] unter Verwendung der APR-Version [1.7.0].
03.06.2020 10:31:30.941 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR-Funktionen: IPv6[true], sendfile[true], Accept-Filter[false], Random[true].
03.06.2020 10:31:30.941 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR/OpenSSL-Konfiguration: useAprConnector [false], useOpenSSL [true]
03.06.2020 10:31:30.944 INFO [main] org.apache.catalina.core.AprLifecycleListener.initializeSSL OpenSSL erfolgreich initialisiert [OpenSSL 1.1.1g 21. April 2020]
03.06.2020 10:31:31.032 INFO [main] org.apache.coyote.AbstractProtocol.init Protokollhandler wird initialisiert ["http-nio-8080"]
03.06.2020 10:31:31.046 INFO [main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Verwenden eines gemeinsamen Selektors zum Schreiben/Lesen von Servlets
03.06.2020 10:31:31.055 INFO [main] org.apache.catalina.startup.Catalina.load Initialisierung in 175489 ms verarbeitet
03.06.2020 10:31:31.080 INFO [main] org.apache.catalina.core.StandardService.startInternal Dienst wird gestartet [Catalina]
03.06.2020 10:31:31.080 INFO [main] org.apache.catalina.core.StandardEngine.startInternal Servlet-Engine wird gestartet: Apache Tomcat/8.5.55
03.06.2020 10:31:31.089 INFO [main] org.apache.coyote.AbstractProtocol.start Protokollhandler wird gestartet ["http-nio-8080"]
03.06.2020 10:31:31.102 INFO [main] org.apache.catalina.startup.Catalina.start Serverstart in 47 ms

tomat-Startup ist hauptsächlich in Catalina

Bildbeschreibung hier einfügen
Bildbeschreibung hier einfügen

Dann

Bildbeschreibung hier einfügen

Start-up

/**
* Warten und herunterfahren.
*/
öffentliche Leere warte() {

 getServer().warte();


}

Tatsächlich ist der Tomcat-Start im Wesentlichen nur ein Socket-Server.

@Überschreiben
öffentliche Leere warte() {
 // Negative Werte - nicht auf Port warten - Tomcat ist eingebettet oder wir mögen einfach keine Ports
 wenn (Port == -2) {
 // noch nicht dokumentiert – zum Einbetten von Apps, die bereits vorhanden und aktiv sind.
 zurückkehren;
 }
 wenn (Port==-1) {
 versuchen {
  awaitThread = Thread.aktuellerThread();
  während(!stopAwait) {
  versuchen {
   Thread.sleep( 10000 );
  } Fang(UnterbrocheneAusnahme ex ) {
   // weitermachen und die Flagge prüfen
  }
  }
 Endlich
  warteThread = null;
 }
 zurückkehren;
 }


 // Richten Sie einen Server-Socket ein, auf den gewartet werden soll
 versuchen {
 awaitSocket = neuer ServerSocket(Port, 1,
  InetAddress.getByName(Adresse));
 } Fang (IOException e) {
 log.error("StandardServer.await: erstellen[" + Adresse
    + ":" + Anschluss
    + "]: ", e);
 zurückkehren;
 }


 versuchen {
 awaitThread = Thread.aktuellerThread();


 //Schleife, in der auf eine Verbindung und einen gültigen Befehl gewartet wird
 während (!stopAwait) {
  ServerSocket serverSocket = warte aufSocket;
  wenn (serverSocket == null) {
  brechen;
  }


  // Auf die nächste Verbindung warten
  Socket-Socket = null;
  StringBuilder-Befehl = neuer StringBuilder();
  versuchen {
  InputStream-Strom;
  lange acceptStartTime = System.currentTimeMillis();
  versuchen {
   socket = serverSocket.accept(); //Nach der Annahme wird Folgendes ausgeführt socket.setSoTimeout(10 * 1000); // Zehn Sekunden
   stream = socket.getInputStream();
  } Fang (SocketTimeoutException ste) {
   // Das sollte eigentlich nie passieren, aber Fehler 56684 deutet darauf hin, dass
   // das tut es.
   log.warnen(sm.getString("standardServer.accept.timeout",
    Long.valueOf(System.currentTimeMillis() - acceptStartTime)), ste);
   weitermachen;
  } Fang (AccessControlException ace) {
   log.warn(sm.getString("standardServer.accept.security"), ace);
   weitermachen;
  } Fang (IOException e) {
   wenn (StoppWarten) {
   // Warten wurde mit socket.close() abgebrochen
   brechen;
   }
   log.error(sm.getString("standardServer.accept.error"), e);
   brechen;
  }


  // Einen Satz Zeichen aus dem Socket lesen
  int expected = 1024; // Abschneiden, um DoS-Angriff zu vermeiden
  während (erwartet < shutdown.length()) {
   wenn (random == null)
   zufällig = neuer Zufallsgenerator();
   erwartet += (random.nextInt() % 1024);
  }
  während (erwartet > 0) {
   Int ch = -1;
   versuchen {
   ch = stream.lesen();
   } Fang (IOException e) {
   log.warn(sm.getString("standardServer.accept.readError"), e);
   ch = -1;
   }
   // Steuerzeichen oder EOF (-1) beendet die Schleife
   wenn (ch < 32 || ch == 127) {
   brechen;
   }
   befehl.anhängen((char) ch);
   erwartet--;
  }
  Endlich
  // Schließen Sie den Socket, da wir damit fertig sind
  versuchen {
   wenn (Socket != null) {
   socket.schließen();
   }
  } Fang (IOException e) {
   // Ignorieren
  }
  }


  // Vergleich mit unserer Befehlszeichenfolge
  Boolesche Übereinstimmung = command.toString().equals(shutdown);
  wenn (Übereinstimmung) {
  log.info(sm.getString("standardServer.shutdownViaPort"));
  brechen;
  } anders
  log.warn(sm.getString("standardServer.invalidShutdownCommand", command.toString()));
 }
 Endlich
 ServerSocket serverSocket = warte aufSocket;
 warteThread = null;
 warte aufSocket = null;


 // Server-Socket schließen und zurückkehren
 if (serverSocket != null) {
  versuchen {
  serverSocket.close();
  } Fang (IOException e) {
  // Ignorieren
  }
 }
 }
} 

Bildbeschreibung hier einfügen

Nach dem Start des Tomcat-Containers ist Folgendes der Inhalt des Springmvc-Moduls

Bildbeschreibung hier einfügen
Bildbeschreibung hier einfügen

Dies ist das Ende dieses Artikels darüber, wie Sie mit dem Quellcode-Debuggen von Tomcat in Idea beginnen und Tomcat zum Debuggen aufrufen. Weitere Inhalte zum Starten des Quellcode-Debuggens von Tomcat in Idea finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • Beispiel einer Methode zur schnellen Schnittstellengenerierung für die Implementierung der Ideenklasse
  • Tipps zum Debuggen von Quellcode in IDEA: Identifizieren Sie den richtigen Pfad für mehrere Implementierungsklassen abstrakter Klassen oder Schnittstellen

<<:  Was macht der legendäre VUE-Syntax-Sugar?

>>:  Zusammenfassung häufiger Probleme mit MySQL-Indizes

Artikel empfehlen

Änderung der Standardquelldatei sources.list des Ubuntu20.04 LTS-Systems

Wenn Sie den Inhalt der Datei „source.list“ verse...

So führen Sie eine reibungslose if-Beurteilung in js durch

Inhaltsverzeichnis Vorwort Code-Implementierung I...

Sieben Möglichkeiten zur Implementierung der Array-Deduplizierung in JS

Inhaltsverzeichnis 1. Verwenden von Set()+Array.f...

Grundlegende Kenntnisse zur MySQL-Wurmreplikation

Würmer replizieren sich, wie der Name schon sagt,...

So betten Sie mithilfe von Iframe andere Webseiten in eine Webseite ein

So verwenden Sie Iframe: Code kopieren Der Code l...

Beispielanalyse für MySQL Oracle- und SQL Server-Paging-Abfragen

Ich habe vor Kurzem eine einfache Studie zur Date...

Detaillierte Erläuterung der Nginx Reverse Proxy WebSocket-Konfiguration

Kürzlich habe ich bei der Arbeit an einem Projekt...

Detaillierte Erklärung der MySql-Installation und des Logins

Überprüfen Sie, ob MySQL bereits unter Linux inst...

Wie erreicht MySQL die Parallelität mehrerer Versionen?

Inhaltsverzeichnis MySQL-Mehrversionen-Parallelit...

Prinzip und Implementierung der parallelen Replikation von MySQL5.7

Jeder, der ein wenig über Datenoperationen und -w...

Erläuterung der Lösung zur mobilen H5-Bildgenerierung in JavaScript

Derzeit gibt es viele Betriebsaktivitäten für öff...