idea 開発ツールを使用してコードをデバッグする場合、Java Web プロジェクトで、Web コンテナーとして Tomcat を使用し、ブレークポイント デバッグ トレースを実行すると、org.apache.catalina パッケージにトレースするときに、入ることができません。これは、idea で実行されている Tomcat がプラグインを通じて統合されており、Tomcat 内の lib パッケージがプロジェクトの依存パスにないため、トレースできないためです。 まず、自分のプロジェクトで Tomcat からコールバックされるインターフェース実装クラスにブレークポイントをマークし、idea を通じて Web プロジェクトを起動します。図に示すブレークポイント情報が表示されると、ブレークポイントの位置は Tomcat からコールバックされるインターフェースクラスをマークしているため、コールスタックは Tomcat の内部コードです。ただし、この時点では org.apache.catalina パッケージの下のクラス名をダブルクリックしても応答がありません。これは、Tomcat に対応する依存ファイルをクラスパスに追加していないためです。 依存関係の追加 <依存関係> <グループ ID>org.apache.tomcat</グループ ID> <artifactId>tomcat-catalina</artifactId> <バージョン>8.5.55</バージョン> <scope>提供</scope> </依存関係> tomcatのlibディレクトリにあるjarファイルは実行時に使用されるため、ここでのスコープは提供されたメソッドを使用します。 これでTomcatソースコードのデバッグに入ることができます tomcat の起動ログはどのように印刷されますか?
VersionLoggerListenerログを見つけると、次の情報が表示されます。 プライベート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")); if (logArgs) { リスト<String> args = ManagementFactory.getRuntimeMXBean().getInputArguments(); for (文字列引数:引数) { log.info(sm.getString("versionLoggerListener.arg", arg)); } } ログ環境の場合 SortedMap<String, String> sortedMap = new TreeMap<>(System.getenv()); Map.Entry<String, String> e の場合: sortedMap.entrySet()) { log.info(sm.getString("versionLoggerListener.env", e.getKey(), e.getValue())); } } (ログプロパティ)の場合{ SortedMap<String, String> sortedMap = new TreeMap<>(); Map.Entry<Object, Object> e の場合: System.getProperties().entrySet()) { sortedMap.put(String.valueOf(e.getKey()), String.valueOf(e.getValue())); } Map.Entry<String, String> e の場合: sortedMap.entrySet()) { log.info(sm.getString("versionLoggerListener.prop", e.getKey(), e.getValue())); } } } 検出はキーと値のペアを通じて取得され、その後グローバル文字列検索を通じて発見される。 しかし、一致しているのは英語なので、中国語はどのように入力すればよいのでしょうか? 最終的にデバッグを通じて、私はこれを見つけました 上記と同様に、デバッグ中に、tocmatによって開始されたものがまだかなりたくさんあることがわかりました。次のものを見てください。 アイデアTomcat起動後のデータ
上記は基本的な環境設定であり、これで Tomcat サービスにリンクする準備が整いました。
トマトのスタートアップは主にカタリナ島にあります それから 起動する /** * 待機してシャットダウンします。 */ パブリックvoid待機() { getServer() を待機します。 } 実際、Tomcat の起動は本質的には単なるソケット サーバーです。 @オーバーライド パブリックvoid待機() { // 負の値 - ポートを待機しない - Tomcat が埋め込まれているか、ポートが気に入らないだけです if (ポート == -2) { // まだ文書化されていません - 稼働中のアプリを埋め込むためのものです。 戻る; } ポート==-1の場合{ 試す { 現在のスレッドを待機します。 while(!stopAwait) { 試す { スレッド.スリープ(10000); } キャッチ(InterruptedException ex) { // 続行してフラグをチェックする } } ついに 待機スレッド = null; } 戻る; } // 待機するサーバーソケットを設定する 試す { awaitSocket = 新しい ServerSocket(ポート, 1, InetAddress.getByName(アドレス)); } キャッチ (IOException e) { log.error("StandardServer.await: create[" + アドレス + ":" + ポート + "]: ", e); 戻る; } 試す { 現在のスレッドを待機します。 // 接続と有効なコマンドを待つループ while (!stopAwait) { サーバーソケット serverSocket = awaitSocket; (serverSocket == null)の場合{ 壊す; } // 次の接続を待つ ソケット socket = null; StringBuilder コマンド = new StringBuilder(); 試す { InputStream ストリーム; 長い acceptStartTime = System.currentTimeMillis(); 試す { socket = serverSocket.accept(); // acceptすると、次のコードが実行されます socket.setSoTimeout(10 * 1000); // 10秒 ストリーム = socket.getInputStream(); } catch (SocketTimeoutException ste) { // これは決して起こらないはずであるが、バグ56684は、 // そうです。 log.warn(sm.getString("standardServer.accept.timeout", Long.valueOf(System.currentTimeMillis() - acceptStartTime)), ste); 続く; } キャッチ (AccessControlException ace) { log.warn(sm.getString("standardServer.accept.security"), ace); 続く; } キャッチ (IOException e) { 停止待ちの場合 // socket.close() により待機が中止されました 壊す; } ログエラー(sm.getString("standardServer.accept.error"), e); 壊す; } // ソケットから文字セットを読み取ります int expected = 1024; // DoS攻撃を避けるためにカットオフ while (期待値 < シャットダウン長さ()) { if (ランダム == null) ランダム = 新しい Random(); 予想 += (random.nextInt() % 1024); } (期待値 > 0) { 整数ch = -1; 試す { ch = ストリーム.read(); } キャッチ (IOException e) { log.warn(sm.getString("standardServer.accept.readError"), e); ch = -1; } // 制御文字またはEOF (-1) でループを終了します ch < 32 || ch == 127 の場合 壊す; } コマンド.append((char) ch); 期待される - ; } ついに // 作業が終わったのでソケットを閉じます 試す { ソケットが null の場合 ソケットを閉じます。 } } キャッチ (IOException e) { // 無視する } } // コマンド文字列と一致 ブール値 match = command.toString().equals(shutdown); (一致)の場合{ ログ情報(sm.getString("standardServer.shutdownViaPort")); 壊す; } それ以外 log.warn(sm.getString("standardServer.invalidShutdownCommand", command.toString())); } ついに サーバーソケット serverSocket = awaitSocket; スレッドを待機 = null; ソケットを待機 = null; // サーバーソケットを閉じて戻ります if (serverSocket != null) { 試す { serverSocket.close(); } キャッチ (IOException e) { // 無視する } } } } tomcatコンテナが起動すると、Springmvcモジュールの内容は次のようになります。 Idea で tomcat のソース コードのデバッグを開始し、デバッグのために tomcat に入る方法については、これでこの記事は終わりです。Idea で tomcat のソース コードのデバッグを開始する方法の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: 伝説的な VUE 構文シュガーは何をするのでしょうか?
1.まずAlibaba Cloudのウェブサイトにログインしてアカウントを登録し、サーバータイプを...
1. インストール1. MySQLをダウンロードするダウンロードアドレス: リンクアドレスブラウザで...
背景CVE-2021-21972 VMware vCenter における認証されていないコマンド実行...
目次序文1. DDL 1.1 データベース操作1.2 データテーブルの操作1.3 一般的なデータ型1...
Ubuntu 17.10 での openssh-server のインストールと使用を記録します。イン...
MySQL は強力なオープンソース データベースです。データベース駆動型アプリケーションの数が増える...
目次UIデザインEcharts の例の効果序文サンプルコード最終結果UIデザイン Echarts の...
目次1. 手書きのインスタンス2.配列のマップメソッドを実装する3. Reduceは配列のmapメソ...
序文最近、職場でこの要件に遭遇し、リモート接続を確立するのに 1 時間以上かかりました。ローカル コ...
目次手動展開1.アイデアを使ってSpring Bootプロジェクトを作成する2. プロジェクトをJa...
この記事では、適応解像度を実現するためのVue2.0の具体的なコードを参考までに紹介します。具体的な...
<br />この世に道はない。より多くの人が歩くようになると、それは道になります。最初は...
数日前、Google Reader で Yu Bo さんが共有した投稿「空のパスがページのパフォーマ...
1. フロート+オーバーフロー:非表示このメソッドは主にオーバーフローを通じて BFC をトリガーし...
1. ダウンロードしたMySQLの圧縮パッケージをインストールディレクトリに解凍します。 2. 新し...