僕は普段 Java の IDE (統合開発環境)として Eclipse を使ってますが、久しぶりに IDE なしでサーブレットを作る機会がありました。結構ハマったこともあって、普段いかに Eclipse に頼っているのかを痛感しました・・・
今回やりたかったことは、ごくごくシンプルな話で、
(1) サーブレットの Java ソースファイルを書いて、
(2) JDK でビルドしてサーブレットの class ファイルを作る
という2つです。要はサーブレットの実行環境が特殊で war ファイルとかをデプロイできないため、 class ファイルをそのまま配置する必要がある、という(IBM Domino とかの)ケースを想定しています。
なお環境は Windows7 で、JDK 1.8 はダウンロード&インストール済みとします。
まず (1) のソースファイルは以下のような感じにしました。パッケージも指定していません。これを UTF-8 で記述して、HelloWorld.java というファイル名で保存します:
↑特別なことは何もしてない、ごくごくシンプルな「ハローワールド!」です。
さて、これを (2) JDK でビルドして class ファイルに・・・という段階で何度かつまづきました。
まずは普通にそのままコンパイルしてみると、
「ハローワールド!」という日本語文字列のエンコードでエラーが出てしまいました。ちゃんとソースコードは UTF-8 にしたつもりだったのに・・・
実は Windows 版の JDK の javac はソースコードが Shift-JIS で書かれているものとして動作するらしいのでした(なんちゅうクソ仕様・・・)。便利とは思えない仕様ですが、このエラーを回避するにはコマンドラインパラメータでソースコードのエンコードを指定必要があるのでした。
というわけで今度は UTF-8 を指定してコンパイル。すると別のエラーが大量に・・・
これら全てサーブレットの JAR ライブラリを(指定していないので)見つけられないことが原因のエラーです。これは普段の Eclipse 環境でも指定していることでしたが、すっかり忘れていました。
Tomcat あたりをダウンロード&インストールして、サーブレット JAR ファイル(servlet-api.jar とかいう名前だと思います)を見つけて取り出します(以下の例では c:\arc\servlet-api-3.1.jar というパスで保存しているものとして記述しています)。で、改めてこのファイルを classpath に指定してコンパイル:
無事コンパイルできました。HelloWorld.class が出来ているはずです:
・・・こ、こんなに難しかったっけ? (^^;
この応用で、作ったサーブレットを実際に IBM Domino 上で動かすための設定についてはこちら。
今回やりたかったことは、ごくごくシンプルな話で、
(1) サーブレットの Java ソースファイルを書いて、
(2) JDK でビルドしてサーブレットの class ファイルを作る
という2つです。要はサーブレットの実行環境が特殊で war ファイルとかをデプロイできないため、 class ファイルをそのまま配置する必要がある、という(IBM Domino とかの)ケースを想定しています。
なお環境は Windows7 で、JDK 1.8 はダウンロード&インストール済みとします。
まず (1) のソースファイルは以下のような感じにしました。パッケージも指定していません。これを UTF-8 で記述して、HelloWorld.java というファイル名で保存します:
//. HelloWorld.java import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWorld extends HttpServlet{ @Override protected void doGet( HttpServletRequest req, HttpServletResponse res ){ try{ res.setContentType( "text/plain; charset=UTF-8" ); res.getWriter().println( "ハローワールド!" ); }catch( Exception e ){ e.printStackTrace(); } } }
↑特別なことは何もしてない、ごくごくシンプルな「ハローワールド!」です。
さて、これを (2) JDK でビルドして class ファイルに・・・という段階で何度かつまづきました。
まずは普通にそのままコンパイルしてみると、
C:\tmp>javac HelloWorld.java HelloWorld.java:11: エラー: この文字は、エンコーディングMS932にマップできません res.getWriter().println( "繝上Ο繝シ繝ッ繝シ繝ォ繝会シ?" );
「ハローワールド!」という日本語文字列のエンコードでエラーが出てしまいました。ちゃんとソースコードは UTF-8 にしたつもりだったのに・・・
実は Windows 版の JDK の javac はソースコードが Shift-JIS で書かれているものとして動作するらしいのでした(なんちゅうクソ仕様・・・)。便利とは思えない仕様ですが、このエラーを回避するにはコマンドラインパラメータでソースコードのエンコードを指定必要があるのでした。
というわけで今度は UTF-8 を指定してコンパイル。すると別のエラーが大量に・・・
C:\tmp>javac -encoding utf-8 HelloWorld.java
HelloWorld.java:3: エラー: パッケージjavax.servletは存在しません
import javax.servlet.*;
^
HelloWorld.java:4: エラー: パッケージjavax.servlet.httpは存在しません
import javax.servlet.http.*;
^
HelloWorld.java:6: エラー: シンボルを見つけられません
public class DominoInfo extends HttpServlet{
^
シンボル: クラス HttpServlet
HelloWorld.java:8: エラー: シンボルを見つけられません
protected void doGet( HttpServletRequest req, HttpServletResponse res ){
^
シンボル: クラス HttpServletRequest
:
:
これら全てサーブレットの JAR ライブラリを(指定していないので)見つけられないことが原因のエラーです。これは普段の Eclipse 環境でも指定していることでしたが、すっかり忘れていました。
Tomcat あたりをダウンロード&インストールして、サーブレット JAR ファイル(servlet-api.jar とかいう名前だと思います)を見つけて取り出します(以下の例では c:\arc\servlet-api-3.1.jar というパスで保存しているものとして記述しています)。で、改めてこのファイルを classpath に指定してコンパイル:
C:\tmp>javac -classpath c:\arc\servlet-api-3.1.jar -encoding utf-8 HelloWorld.java
C:\tmp>
無事コンパイルできました。HelloWorld.class が出来ているはずです:
・・・こ、こんなに難しかったっけ? (^^;
この応用で、作ったサーブレットを実際に IBM Domino 上で動かすための設定についてはこちら。
コメント