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?
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 Aber die Übereinstimmung ist Englisch. Wie geben Sie also Chinesisch ein? Schließlich habe ich durch Debuggen Folgendes gefunden Ähnlich wie oben habe ich beim Debuggen festgestellt, dass immer noch ziemlich viele Dinge von tocmat gestartet werden. Sehen Sie sich das Folgende an Daten nach dem Start von Idea Tomcat
Das Obige ist nur die grundlegende Umgebungskonfiguration. Danach ist es bereit für die Verknüpfung mit dem Tomcat-Dienst.
tomat-Startup ist hauptsächlich in Catalina Dann 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 } } } } Nach dem Start des Tomcat-Containers ist Folgendes der Inhalt des Springmvc-Moduls 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:
|
<<: Was macht der legendäre VUE-Syntax-Sugar?
>>: Zusammenfassung häufiger Probleme mit MySQL-Indizes
Herunterladen und Installieren von JDK Schritt 1:...
Wenn Sie den Inhalt der Datei „source.list“ verse...
Inhaltsverzeichnis Vorwort Code-Implementierung I...
Inhaltsverzeichnis 1. Verwenden von Set()+Array.f...
Würmer replizieren sich, wie der Name schon sagt,...
Suchspiegel Docker-Suche Rocketmq Bildversion anz...
So verwenden Sie Iframe: Code kopieren Der Code l...
Ich habe vor Kurzem eine einfache Studie zur Date...
Laden Sie zuerst die neueste komprimierte MySQL 5...
Routing-Konfigurationsbefehle unter Linux 1. Host...
Kürzlich habe ich bei der Arbeit an einem Projekt...
Überprüfen Sie, ob MySQL bereits unter Linux inst...
Inhaltsverzeichnis MySQL-Mehrversionen-Parallelit...
Jeder, der ein wenig über Datenoperationen und -w...
Derzeit gibt es viele Betriebsaktivitäten für öff...