JAX-RS

時代はJAX-RSって事で。

最初悩んだのがAPサーバを何にするかでした。
当初は、開発Jetty、本番GlassFishでやろうかと考えてました。

1. web.xml
色々情報があって噛み砕けてませんが、
GlassFish→web.xml不要
Jetty,Tomcat→web.xml必要(不要にも出来るらしい)
開発と本番でベースの設定が異なるのは避けたい。

2. デバッグ
Jettyのデバッグ環境をセットアップしていく中で、
gradle jettyRun
で起動しておき、Eclipseでリモートデバッグ
これがそこそこ苦痛。これまでmaven-tomcat-pluginで
Eclipse内でTomcatの起動、デバッグがシームレスに行えていたので、
デバッグまでの手順と設定が多い事がネック。
Jetty組み込みも考えたが、シンプルさに欠ける感じ。

3.その他
・Gradleは今後の為にも使っておきたい。
JAX-RSは是非使いたいが、JavaEEマストではない。
GlassFishの商用サポートが無くなった。

などなど考えて、
開発Jetty、本番Tomcat
にする事にしました。

開発は、あえてGradleを使う事を優先しました。
これまで通りMaven,Tomcatのほうが設定も少なく、
開発しやすいのは分かっているのですが、
「Gradleを使っておきたい」が大きな理由です。
Gradle使うとなればJettyのほうが情報量が多いのでJetty採用。
デバッグの手間は我慢出来ないレベルではないかなと。後に楽なやり方を見出だせる事かも。
本番は、1の理由とGlassFishである絶対の理由が無いので、Tomcatで。

以上を踏まえて、Eclipse上でGradle、JAX-RSを使って、
Jettyで開発出来る環境を作ります。

JDK 1.7.0_45
Eclipse Standard 4.3.1
・Gradle 1.10(binをパスに通す)
それぞれダウンロードとインストール。

・Gradle IDEプラグイン追加
 http://dist.springsource.com/release/TOOLS/update/e4.3
 Eclipse Integration for Gradle
 EclipseからGradleプロジェクトが作成出来るようになる。
 ディレクトリ構成とか手動メンドイので。JavaQuickStartでプロジェクト作成。

・Jettyの起動
 EclipseのExternal ToolsでGradleのjettyRunタスクが実行出来ればよかったのですが、
 どうにもビルドが途中で止まる(8%から進まない)。Jetty自体は起動している。
 jettyStopタスクでも止まらない。他のタスクは動作する。
 External Toolsを諦め、jettyRunタスクの起動スクリプトで実行させる事としました。
 デバッグ起動する必要があるので、以下参考にデバッグモードで起動させます。
Struts 1.3 + Spring 2.5のサンプルアプリ(ついでにGradle化) - wadahiroの日記

set GRADLE_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n
gradle jettyRun

・起動したJettyにリモートデバッグ
 EclipseのDebugからRemoteJavaApplicationで8787にアタッチ。
 URLからGET、ブレークポイントが止まる、ホットデプロイ出来る、OK。

・WARデプロイ
 gradle war
 で作成したWARをTomcatにデプロイ。起動、URLからGET、OK。

・build.gradle

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin : 'jetty'
apply plugin: 'war'

sourceCompatibility = 1.7
version = '1.0'

repositories {
    mavenCentral()
}

dependencies {
    compile 'javax.ws.rs:javax.ws.rs-api:2.0'
    compile 'org.glassfish.jersey.core:jersey-server:2.4'
    compile 'org.glassfish.jersey.containers:jersey-container-servlet:2.4'
    testCompile 'junit:junit:4.11'
}

task wrapper(type: Wrapper) {
    gradleVersion = '1.10'
}

・web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
      id="WebApp_ID" version="3.0">
    <servlet>
        <servlet-name>ServletContainer</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>com.hoge.resources</param-value>
    </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>ServletContainer</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>
</web-app>

JAX-RS(Jersey)いい。これはいい。ブラウザが近く?に感じます。
Gradleは正直、現時点ではMavenのほうが色々やりやすい印象です。
今後に期待です。