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

React-Konfiguration px-Konvertierung rem-Methode

Installieren Sie zugehörige Abhängigkeiten npm ic...

CSS - overflow:hidden in Projektbeispielen

Hier sind einige Beispiele, wie ich diese Eigensch...

Canonical ermöglicht Linux-Desktop-Apps mit Flutter (empfohlen)

Das Ziel von Google mit Flutter bestand immer dar...

MySQL 5.7.17 Winx64 Installations- und Konfigurations-Tutorial

Heute habe ich die MySQL-Datenbank erneut auf mei...

Detaillierte Erläuterung des Datenproxys und der Ereignisse von VUE

Inhaltsverzeichnis Überprüfung der Object.defineP...

Ausführliche Erklärung zur Docker-Maschine

Unterschiede zwischen Docker und Docker Machine D...

Implementierung der Bereitstellung des Nginx+ModSecurity-Sicherheitsmoduls

Inhaltsverzeichnis 1. Herunterladen 2. Bereitstel...

Vue implementiert einen visuellen Drag-Page-Editor

Inhaltsverzeichnis Drag & Drop-Implementierun...

Easyswoole Ein-Klick-Installationsskript und Pagoden-Installationsfehler

Häufig gestellte Fragen Wenn Sie easyswoole zum e...

So stellen Sie Gitlab schnell mit Docker bereit

1. Laden Sie das Gitlab-Image herunter Docker-Pul...