bookmark_border【Tomcat, Windows】「サーバーで必要なポート8080はすでに使用中です」を一発解決するスクリプト【eclipse】

Macだとアクティビティモニタで簡単にプロセスをkillできますが(自分はそうしてた)、Windowsはnetstatしたりサービス一覧を調べたりする方法が出てきて、なんか大変そうだったので。

このスクリプトを実行する

PowerShellでこのスクリプトを実行します。

$processes = Get-Process -Id (Get-NetTCPConnection -LocalPort 8080,8005,8009).OwningProcess
foreach($process in $processes) {
  Stop-Process $process.Id
}

実行方法

  1. Windows PowerShellを立ち上げる
    スタートメニュー(Cortana)の検索で powershell とか打つと候補に出てくる
  2. 上記のスクリプトをコピペしてEnterで実行

エラーっぽい赤い文字が出るかもしれませんが、8005やか8009番ポートを使用しているアプリケーションが存在していないだけで特に問題ありません。

これは何

8080, 8005, 8009番ポートを使用しているプロセスを一括で終了しています。

「ローカルホストのtomcat vXX サーバーで必要なポート8080はすでに使用中です」 is 何

8080番ポートを使うサーバーを起動したいけど、8080番ポートを使用している先客(プロセス)がすでに実行中なので、起動できない。
(すでに実行中のそれは、大抵はeclipseで自分が起動したプロセスの残骸だったりする)

ポート番号の変更は根本解決ではない

eclipseでtomcatのポート番号を変更する方法もありますが、このエラーは前述の通りプロセスの残骸が原因なので、そのプロセスを終了させるほうが正攻法と思われます。(最終手段のPC再起動も事実上はその残骸プロセスを終了させる方法)

bookmark_borderTomcat+Log4j2でコンソール出力 & 任意のファイルに書き込み

Log4j2 + サーブレット(Tomcat)でとりあえず任意のファイルとコンソールへログ出力する上で最低限すべきことをメモ。ログレベルの制御といったことまでは書いていません。

1. Log4j2のダウンロード

Apache ソフトウェア財団から最新版をダウンロード

2. Log4j2のjarをビルドパスに追加

ダウンロードしたzipにいっぱいjarが入っています。そのうち以下のファイルをWEB-INF/libにコピー。
大抵はコピーした段階でeclipseが自動でビルドパスに追加してくれるはずです。

  • log4j-XXX-api-XXX.jar
  • log4j-api-XXX.jar
  • log4j-core-XXX.jar
  • log4j-web-XXX.jar

※XXXの部分にはバージョン番号が入ります。

3. log4j2.xmlの編集

WEB-INF直下に「log4j2.xml」を以下の内容で記述しつつ、ハイライトされている部分を適宜書き換えます。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="OFF">
  <Appenders>
        <RollingFile name="file"
                fileName="C:\XXX\YYY\hogeapp.log" <!-- 書き込んでほしいログファイルの場所 -->
                filePattern="C:\XXX\YYY\hogeapp-%d{yyyy-MM-dd}-%i.log">
            <PatternLayout pattern="[%date] %-5p %location %m%n"/>
            <Policies>
                <OnStartupTriggeringPolicy />
                <SizeBasedTriggeringPolicy size="256 KB" />
            </Policies>
            <DefaultRolloverStrategy max="100"/>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Logger name="自分のアプリケーションのパッケージ名" level="trace">
            <AppenderRef ref="file" />
        </Logger>
    </Loggers>
</Configuration>

4. ログ出力のコードを書く

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@WebServlet("/Main")
public class Main extends HttpServlet {
    private static Logger logger = LogManager.getLogger();
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        logger.warn("まずい");
        logger.error("かなりまずい");
    }
}