サーバ側(Java)とクライアント側でエディタを別にする

クライアント側をJavaScriptプログラムで作成する場合は、サーバ側のJavaプログラムをEclipseで作成し、クライアント側のJavaScriptプログラムを別のエディタで作成したくなると思います(JavaScriptプログラムの作成に人気のエディタとして、JetBrainsのWebStormや、Sublime Text 2があります)。

このとき少し問題となるのが、EclipseWTPで起動したWebサーバの挙動です。JavaScriptファイルなどの静的コンテンツが別のエディタで更新されても、Eclipseで同期させない限り(F5のリフレッシュなど)、Webサーバは古いデータを配信します(WTPの設定で何とかなるのかもしれませんが、調べきれてません)。これでは、同期させる手間がかかり作業効率が落ちます。

この問題を解決するには、WTPを使用しないでWebサーバを起動する必要があります。まず思いつくのは、Webサーバの起動ファイルを直接実行することです。しかし、この方法だと、Mavenを使ったEclipseプロジェクトの場合、JarファイルをレポジトリからWEB-INF/libにコピーしてくる手間がかかります。また、Jarの依存をMavenで追加するたびにコピーの作業が必要になるためお奨めではありません。

お奨めは、Eclipseプロジェクト内で適当なクラスを作成し、mainメソッドを作成してWebサーバのAPIを呼出しサーバを起動することです。この方法だと、Mavenで追加したJarもそのまま読込めるので手間がかかりません。さらに、変更したクラスを再ロードさせるのも簡単です。下記のコードは、JettyのAPIをmainメソッドで呼出した例です。

package jetty;
import java.util.Scanner;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.webapp.WebAppContext;

public class StartJetty {
	public static void main(String[] args) throws Exception {
		Server server = new Server(8080);
		WebAppContext context = new WebAppContext();
		context.setDescriptor("WebContent/WEB-INF/web.xml");
		context.setWar("WebContent");
		context.setContextPath("/foo");
		context.setExtraClasspath("target/classes");
		server.setHandler(context);
		server.start();
		Scanner s = new Scanner(System.in);
		while (true) {
			s.next();
			context.stop();
			context.start();
		}
	}
}

このmainメソッドをEclipseから実行すれば、ポート8080でWebサーバが立ち上がります。また、コードの下部で、Scannerを使用してwhileのループをさせていますが、これによって、Eclipse内のコンソールウィンドウで何らかの文字を入力してエンターキーを押下するだけで、クラスが再ロードされます。

ちょっとしたことノウハウですが、作業効率の向上に地味に貢献すると思います。

補足

今回のサンプルで使用したJettyのAPIのJarを追加するMavenの依存の記述を以下に示します。

	<dependency>
		<groupId>org.eclipse.jetty</groupId>
		<artifactId>jetty-server</artifactId>
		<version>8.1.5.v20120716</version>
	</dependency>
	<dependency>
		<groupId>org.eclipse.jetty</groupId>
		<artifactId>jetty-servlet</artifactId>
		<version>8.1.5.v20120716</version>
	</dependency>
	<dependency>
		<groupId>org.eclipse.jetty</groupId>
		<artifactId>jetty-webapp</artifactId>
		<version>8.1.5.v20120716</version>
	</dependency>
	<dependency>
		<groupId>org.eclipse.jetty</groupId>
		<artifactId>jetty-servlets</artifactId>
		<version>8.1.5.v20120716</version>
	</dependency>