その時に書きたいものを書きます

その時に書きたいものを書くんです

Tomcat@Eclipse

Eclipseを動かしていてTomcat周りの設定がしっくりこなかったので少しまとめておく。

Eclipse内部に作るTomcatサーバ

これが少しわかりづらかった。ウィザードでぽんぽんと勝手にできるものなのだが、要はデバッグなどのためにEclipseから都度使用するTomcatのサーバを用意するというもの。そしてその実体は物理的なサーバというわけではもちろんなくて、当該PCにインストールしたTomcatを起動するときの設定(例えば引数など)の集合のことである。

Eclipse内のTomcatの設定は、例えば「デバッグ構成」の画面で確認できる。

f:id:yyyske:20140919174003p:plain

起動引数とかも指定している感じ。デバッグするときはここで定義した方法でサーバを起動して実行しているのだね。

f:id:yyyske:20140919174007p:plain

参考URL

Eclipse を使用しての Java サーブレット・プログラム開発 http://nntoa.web.fc2.com/java/1/4.html#11 (こちらにTomcat起動時のARP云々の話が書いてある。警告消したければここに書いてある手順を踏もう。)

JAVA_HOMEって誰が使うの

環境変数JAVA_HOME。

だいぶ前に環境変数に追加して、なんのために追加したかももはや覚えてなかったので改めて調べてみた。

Tomcatのもの

こいつを参照している代表格がTomcatである。Tomcatのbin配下のsetclasspath.batに以下のような記述があるよ。

rem ---------------------------------------------------------------------------
rem Set JAVA_HOME or JRE_HOME if not already set, ensure any provided settings
rem are valid and consistent with the selected start-up options and set up the
rem endorsed directory.
rem ---------------------------------------------------------------------------

rem Make sure prerequisite environment variables are set

rem In debug mode we need a real JDK (JAVA_HOME)
if ""%1"" == ""debug"" goto needJavaHome

rem Otherwise either JRE or JDK are fine
if not "%JRE_HOME%" == "" goto gotJreHome
if not "%JAVA_HOME%" == "" goto gotJavaHome
echo Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
echo At least one of these environment variable is needed to run this program
goto exit

:needJavaHome
rem Check if we have a usable JDK
if "%JAVA_HOME%" == "" goto noJavaHome
if not exist "%JAVA_HOME%\bin\java.exe" goto noJavaHome
if not exist "%JAVA_HOME%\bin\javaw.exe" goto noJavaHome
if not exist "%JAVA_HOME%\bin\jdb.exe" goto noJavaHome
if not exist "%JAVA_HOME%\bin\javac.exe" goto noJavaHome
set "JRE_HOME=%JAVA_HOME%"
goto okJava

:noJavaHome
echo The JAVA_HOME environment variable is not defined correctly.
echo It is needed to run this program in debug mode.
echo NB: JAVA_HOME should point to a JDK not a JRE.
goto exit

:gotJavaHome
rem No JRE given, use JAVA_HOME as JRE_HOME
set "JRE_HOME=%JAVA_HOME%"

:gotJreHome
rem Check if we have a usable JRE
if not exist "%JRE_HOME%\bin\java.exe" goto noJreHome
if not exist "%JRE_HOME%\bin\javaw.exe" goto noJreHome
goto okJava

:noJreHome
rem Needed at least a JRE
echo The JRE_HOME environment variable is not defined correctly
echo This environment variable is needed to run this program
goto exit

:okJava
rem Don't override the endorsed dir if the user has set it previously
if not "%JAVA_ENDORSED_DIRS%" == "" goto gotEndorseddir
rem Set the default -Djava.endorsed.dirs argument
set "JAVA_ENDORSED_DIRS=%CATALINA_HOME%\endorsed"
:gotEndorseddir

rem Set standard command for invoking Java.
rem Note that NT requires a window name argument when using start.
rem Also note the quoting as JAVA_HOME may contain spaces.
set _RUNJAVA="%JRE_HOME%\bin\java"
set _RUNJDB="%JAVA_HOME%\bin\jdb"

goto end

:exit
exit /b 1

:end
exit /b 0

このようにTomcatはベタでJAVA_HOMEを参照することにしている模様。TomcatのためにJAVA_HOMEをちゃんと設定してあげよう。

Tomcatのためだけじゃない

Tomcatに合わせて定義したJAVA_HOMEであるが、Tomcatのためだけに使われているわけではない。例えばわたしの環境では、以下のように環境変数Pathに溶け込んでいた。い、いつの間に!

f:id:yyyske:20140909165948p:plain

これはRapid Environment Editorという神ツール環境変数見た画面である。

こうしておくと、Tomcatが見るJDKと、PC上デフォルトで使用するJDKのバージョンを合わせることができる。逆に言うと合ってしまう。要注意な。

Tomcat以外にもJAVA_HOMEを見ている何かしらがあるそうなので、JAVA_HOMEを見てそうなやつがいたら注意深く観察する必要がある。場合もある。例えばAndroidSDKのインストーラJAVA_HOMEを見ているようです。

参考:Android SDK のインストールエラー JAVAが見つからないエラー対処法はJAVA_HOMEの設定: 一番わかりやすいAndroidアプリ開発入門

クラスパスについて

クラスパスっていう言葉が腹落ちしないので掘り下げる。

クラスパス=classまでのパス=JDKツールの探し先

Javaのプログラムはclassの集合である。.javaのファイルを作成し、それをコンパイルして.classを作成する。その.classのファイルが組み合わさって一つのアプリケーションとなる。これははるか昔新人研修のころにやって覚えたことだ。

クラスパスっていうのは、その一つ一つのクラスがどこにあるのか、を定義したものだ。

組み合わさって動こうにも、どこにあるのかがわからなければクラスたちは組み合わさることができない。クラスたちを統括する誰かが「このクラスはここにあって、このクラスはここにある」というのを把握しているから、クラスたちは組み合わさることができる。これがクラスパスの基本である。

CLASSPATHは何者だ

クラスパスではなくCLASSPATH。 狭義のクラスパスとでも言おうか。これは環境変数である。CLASSPATHという環境変数を宣言し、そこにクラスパスをいくつか指定してやると、JDKツールjava、jdb、javac、javahのことを言うらしい)は、このパスの中にもクラスを探しに行くことになる。

このように、「CLASSPATH」という環境変数を使ってクラスパスを設定することもできるが、これはアプリケーション個別で設定しているわけではなく、他のアプリケーションと齟齬がでてきてしまう可能性があるため、推奨はされていない模様。JDKツールjava、jdb、javac、javah)の-classpathオプションを使用して、アプリケーション個々で設定したほうが良さそうである。

Eclipseのビルド・パス

Eclipseのビルド・パス設定画面のライブラリータブにずらーっと並んでいるjarは、パスが指定されているものであり、コンパイル時や実行時にこのパスのjarが検索対象となる。ビルド・パスと言っているが、クラスパスとほぼ同義な模様。

まとめ

  • クラスパスというのは、java.exeやjavac.exeといったJDKツールが、実行時に使用するクラスを探しに行く先のディレクトリのこと。
  • 環境変数で一括で設定もできるが、JDKツールの-classpathオプションで個々に定義するのが推奨される。
  • EclipseJavaプロジェクトではビルド・パスの画面で設定を行う。

Tomcatを起動したのにlocalhost:8080で起動確認できない時

そんな時がある。

Tomcatのインストールディレクトリまでcdで潜って、そこで

startup.bat

を実行した場合、このような現象に見舞われる。

C:\にいる状態で、

Tomcatのインストールディレクトリまでのパス\startup.bat

を実行した場合、無事localhost:8080でページを取得できる。

コマンドを実行する場所によって何かが変わっている??

いずれ調べる。