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. レジストリについて公式 Docker ハブは、パブリックイメージを管理するのに適した場所です。...
目次1. インストール2. プロジェクトにインポートしてマウントする3. 使用Vue2.x はコンポ...
<br />百度百科事典の正式版がついにオンラインになりました。2年間の「テスト版」の帽...
目次1. useStateフック2. useRefフック3. useRef と useState 4...
目次1 つの Redis 設定ファイル2 Dockerコマンドの開始3 docker-compose...
目次導入Homebrewをインストールするnvmをインストールするノードをインストールするインストー...
質問LINUX では、定期的なタスクは通常、cron デーモン プロセス [ps -ef | gre...
この記事では、jQuery キャンバスを使用して QR コード付きのポスターを生成するための具体的な...
目次序文需要分析MySQL ユーザー変数累積計算にMysqlユーザー変数を使用する要約するこの記事で...
VueはPCカメラを呼び出してリアルタイムで写真を撮影します。参考までに、具体的な内容は次のとおりで...
win7 64 ビットで mysql-5.7.5-m15-winx64 をインストールして構成する方...
MySQL で、id、a、b の 3 つのフィールドを持つ新しいテーブルを作成します。次のように、同...
目次バインディングクラスインラインスタイルのバインディングバインディングクラス方法1:オブジェクト構...
JS アニメーションの代わりに CSS アニメーションを使用する必要があるのはなぜですか? Java...
序文場合によっては、次の図のような浮動効果の要件が必要になります。 成し遂げる標準的な通常の状況では...