秒速で始める Java EE 7 with Wildfly


f:id:Naotsugu:20150213230909p:plain

gradle がインストールされている前提。 されていない場合は以下で入れておく。

brew install gradle

開始

ターミナルに以下のブロックを全て選択してコピペする。

mkdir example
cd example
cat <<EOF > build.gradle
plugins {
    id 'java'
    id 'war'
    id 'com.bmuschko.cargo' version "2.0.3"
}
repositories { mavenCentral() }
[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'
sourceCompatibility = 1.8
targetCompatibility = 1.8
dependencies {
    providedCompile 'org.jboss.spec:jboss-javaee-all-7.0:1.0.2.Final'
    testCompile 'junit:junit:4.11'
}
cargo {
    containerId = 'wildfly8x'
    deployable {
        file = file(war.archivePath)
    }
    local {
        installer {
            installUrl = 'http://download.jboss.org/wildfly/8.2.0.Final/wildfly-8.2.0.Final.zip'
            downloadDir = new File(buildDir, "download")
            extractDir = file("wildfly")
        }
        containerProperties { property 'cargo.jboss.configuration', 'standalone-full' }
    }
}
task wrapper(type: Wrapper) {
    gradleVersion = '2.2.1'
}
EOF
mkdir -p src/main/java/example
cat <<EOF > src/main/java/example/HelloWorld.java
package example;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(name = "HelloWorld", urlPatterns = { "/HelloWorld" })
public class HelloWorld extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html; charset=UTF-8");
        PrintWriter writer = response.getWriter();
        writer.println("<html>");
        writer.println("<html><head><title>HelloServlet</title></head>");
        writer.println("<body><h1>Hello Servlet</h1></body>");
        writer.println("</html>");
    }
}
EOF
gradle wrapper
./gradlew war cargoRunLocal

しばらくして以下が出たら、

Press Ctrl-C to stop the container...

ブラウザで以下のURLにアクセス

http://localhost:8080/example/HelloWorld

完了。

f:id:Naotsugu:20150213230031p:plain

秒速です。ダウンロードしてる時間除けば。

でも2回目からは完全に秒速です。

build.gradle

念のため説明書いておきます。

build.gradle は以下のようになります。秒速のコピペではヒアドキュメントで $ がシェル変数に解釈されてしまうので変えてあります。

plugins {
    id 'java'
    id 'war'
    id 'com.bmuschko.cargo' version "2.0.3"
}

repositories {
    mavenCentral()
}

[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'
sourceCompatibility = 1.8
targetCompatibility = 1.8


dependencies {
    providedCompile 'org.jboss.spec:jboss-javaee-all-7.0:1.0.2.Final'
    testCompile 'junit:junit:4.11'
}

cargo {
    containerId = 'wildfly8x'
    
    deployable {
        file = file(war.archivePath)
    }

    local {
        installer {
            installUrl = 'http://download.jboss.org/wildfly/8.2.0.Final/wildfly-8.2.0.Final.zip'
            downloadDir = file("$buildDir/download")
            extractDir = file("wildfly")
        }
        containerProperties { property 'cargo.jboss.configuration', 'standalone-full' }
    }

}

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

plugins の指定は gradle 2.1 以降の id 表記でビルドスクリプトの定義が楽になりました。最下部の gradle wrapper で gradle の 2.2.1 を指定しています。

dependencies では JavaEE 7 の API 仕様 を providedCompile で指定しています。'javax:javaee-api:7.0' ではなく、jboss 提供のものとしています。'javax:javaee-api' には実装クラスまで入っているため(少なくとも6.0までは)、テスト時に変なハマり方するので jboss 提供のきれいなAPI 仕様を使うのが通例です。

デプロイは cargo にお任せで、containerIdwildfly8x 指定しています。wildfly 自体も cargo の installer 指定で自動ダウンロードしてもらい、解凍ファイルは clean タスクで消されないようにプロジェクトルートに配備してます。

cargo プラグインcargoRunLocal タスクで wildfly ダウンロードから war のデプロイまでやってくれます。

containerProperties でフルプロファイル指定にしています。そのままだと Web プロファイルになるので。

サーブレット

Java側は、EE 7 と言いながら EE 6 相当の実装しかしていませんが、 @WebServlet 指定で web.xml いらずの単純なサーブレットです。

package example;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(name = "HelloWorld", urlPatterns = { "/HelloWorld" })
public class HelloWorld extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        
        response.setContentType("text/html; charset=UTF-8");
        PrintWriter writer = response.getWriter();
        writer.println("<html>");
        writer.println("<html><head><title>HelloServlet</title></head>");
        writer.println("<body><h1>Hello Servlet</h1></body>");
        writer.println("</html>");
    }
}

秒速で始めましたが、wildfly の管理コンソールは管理ユーザ追加しないと入れなかったりするので、このへんは後ほど時間があれば。

分速で始める JavaEE 7 〜 JPA + CDI + JSF 〜 - A Memorandumに続き。