サーバ側(Java)とクライアント側でエディタを別にする
クライアント側をJavaScriptプログラムで作成する場合は、サーバ側のJavaプログラムをEclipseで作成し、クライアント側のJavaScriptプログラムを別のエディタで作成したくなると思います(JavaScriptプログラムの作成に人気のエディタとして、JetBrainsのWebStormや、Sublime Text 2があります)。
このとき少し問題となるのが、EclipseのWTPで起動した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>