カタカタブログ

SIerで働くITエンジニアがカタカタした記録を残す技術ブログ。Java, Oracle Database, Linuxが中心です。たまに数学やデータ分析なども。

IntelliJ IDEA(Ultimate)でのJava・SOAPサービス開発とGradleでのwarビルドを試す

はじめに

久しぶりにJavaでSOAP WebServiceアプリケーションを作成する機会があった(今どきSOAP、とかいう話はさておき)ので、検証結果をメモ。
昔、Eclipse + MetroでSOAPサービスを作ってWebLogicに公開する手順を公開した。
totech.hateblo.jp
今回せっかくなのでIntelliJ IDEA Ultimate版で同等レベルの簡単なSOAPサービスを実装する。
その上でGradleでビルドしwarファイルを作成し、GlassFishサーバにデプロイしてSoapUIでSOAPサービスが正しく動作していることを確認する。

今回は以下のMacローカル環境で検証した。

$ sw_vers
ProductName:    Mac OS X
ProductVersion:    10.13.6
BuildVersion:    17G4015
$ java -version
java version "1.8.0_111"
Java(TM) SE Runtime Environment (build 1.8.0_111-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode)
$ echo $JAVA_HOME
/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home
$ gradle -v

------------------------------------------------------------
Gradle 5.1.1
------------------------------------------------------------

Build time:   2019-01-10 23:05:02 UTC
Revision:     3c9abb645fb83932c44e8610642393ad62116807

Kotlin DSL:   1.1.1
Kotlin:       1.3.11
Groovy:       2.5.4
Ant:          Apache Ant(TM) version 1.9.13 compiled on July 10 2018
JVM:          1.8.0_111 (Oracle Corporation 25.111-b14)
OS:           Mac OS X 10.13.6 x86_64

またIntelliJ IDEA 2018.3.3 (Ultimate Edition)を使用。
テストツールとしてSoapUI-5.4.0をSOAPクライアントとして使用。
環境変数JAVA_HOMEの設定を忘れないように。

IDEAで新規WebServiceプロジェクト作成

まずはIntelliJ IDEAで新規プロジェクトを作成し、SOAPアプリケーションを作成する。

IDEAのNew Projectから Java > WebServicesにチェック
※ちなみにIntelliJ IDEA CE版だとJava EEサポート機能がないのでWebServicesチェック項目がない
f:id:osn_th:20190129221015p:plain
Project name等は適当に
f:id:osn_th:20190129221028p:plain
続いてこのプロジェクトをgradleプロジェクトにする。
ターミナルでsoapappプロジェクトディレクトリを開き、gradle initコマンドを実行する。

$ cd soapapp
$ gradle init

Select type of project to generate:
  1: basic
  2: groovy-application
  3: groovy-library
  4: java-application
  5: java-library
  6: kotlin-application
  7: kotlin-library
  8: scala-library
Enter selection (default: basic) [1..8] 4

Select build script DSL:
  1: groovy
  2: kotlin
Enter selection (default: groovy) [1..2] 1

Select test framework:
  1: junit
  2: testng
  3: spock
Enter selection (default: junit) [1..3] 1

Project name (default: soapapp):

Source package (default: soapapp):


BUILD SUCCESSFUL in 24s
2 actionable tasks: 2 executed

これでGradleプロジェクトが用意できたのでSOAPのWebService機能を実装する。
今回は簡単に以下のように@WebServiceアノテーションを持つサービスクラス一つに、
@WebMethodアノテーションを持つ簡単な足し算メソッド一つをSOAPサービスとして公開する。

App.java

package main.java;

import javax.jws.WebMethod;
import javax.jws.WebService;

@WebService
public classApp {
    @WebMethod
    public Integer add(Integer a, Integer b) {
        return a + b;
    }
}

IDEA上で見るとこんなかんじ。
f:id:osn_th:20190129221038p:plain

Gradleでwarファイル作成

build.gradleを以下のように編集し、warプラグインを利用可能にする。
pluginsid ‘war’を追加し、コメントを削除した。それ以外はgradle initによって作成されたデフォルトのまま。

build.gradle

plugins{
    id 'java'
    id 'application'
    id 'war'
}

repositories{
    jcenter()
}

dependencies{
    implementation 'com.google.guava:guava:26.0-jre'
    testImplementation 'junit:junit:4.12'
}

mainClassName = ‘main.java.App'

gradle tasksコマンドを実行し、warタスクが使えるようになっていることを確認。

$ gradle tasks

> Task :tasks

------------------------------------------------------------
Tasks runnable from root project
------------------------------------------------------------

Application tasks
-----------------
run - Runs this project as a JVM application

Build tasks
-----------
assemble - Assembles the outputs of this project.
build - Assembles and tests this project.
buildDependents - Assembles and tests this project and all projects that depend on it.
buildNeeded - Assembles and tests this project and all projects it depends on.
classes - Assembles main classes.
clean - Deletes the build directory.
jar - Assembles a jar archive containing the main classes.
testClasses - Assembles test classes.
★war - Generates a war archive with all the compiled classes, the web-app content and the libraries. 
(・・・略)

確かにwarタスクが使えるようになっているので、これを実行する。

$ gradle war

BUILD SUCCESSFUL in 0s
2 actionable tasks: 2 executed
0 soapapp $ find build
build
build/classes
build/classes/java
build/classes/java/main
build/classes/java/main/main
build/classes/java/main/main/java
build/classes/java/main/main/java/App.class
build/libs
build/libs/soapapp.war ★
build/tmp
build/tmp/compileJava
build/tmp/war
build/tmp/war/MANIFEST.MF

Buildディレクトリ配下にビルドされたclassファイル等が配置される。ここにwarファイルも作成されていることが確認できる。

warファイルをGlassFishにデプロイ

warが作成されたのでアプリケーションサーバにデプロイしてみる。
今回はアプリケーションサーバとしてGlassFishを利用する。

もしGlassFishがインストールされていない場合は以下のようにインストールする。

$ brew install glassfish

GlassFishは以下のコマンドで起動する。

$ /usr/local/Cellar/glassfish/5.0/libexec/glassfish/bin/asadmin start-domain domain1

Waiting for domain1 to start .....
Successfully started the domain : domain1
domain  Location: /usr/local/Cellar/glassfish/5.0/libexec/glassfish/domains/domain1
Log File: /usr/local/Cellar/glassfish/5.0/libexec/glassfish/domains/domain1/logs/server.log
Admin Port: 4848
Command start-domain executed successfully.

正常に起動すると、http://localhost:4848 から管理コンソールにログインできる。

今回は素直にGlassFishの管理コンソールから手動でwarをデプロイする。
ApplicationsのDeployからwarファイルをアップロードしDeployを選択する。
f:id:osn_th:20190129221048p:plain
デプロイしたらsoapappのリンクを開くと、一番下のAcitonにView Endpointというリンクがあるのでそこを開く。
f:id:osn_th:20190129221057p:plain
WSDLが確認できる。
/soapapp1315251054544753865/AppService?wsdl
f:id:osn_th:20190129221103p:plain
このリンクをさらにたどると、以下のようなリンクが表示されるのでそこからWSDLの中身も確認できる。
http://server:8080/soapapp1315251054544753865/AppService?wsdl

SoapUIでテスト

SOAPテストツールとしては定番のSoapUIでテストする。
SoapUIについての説明は割愛するが、以下からダウンロード・インストールできる。
https://www.soapui.org/

SoapUIでNew SOAP Projectを作成する。
Project Nameは適当に入力し、Initial WSDLに上で確認したGlassFish上にデプロイされたWSDLエンドポイントを指定する。
f:id:osn_th:20190129221108p:plain
SOAPサービスが認識されるので、addサービスにパラメータを指定して実行する。
f:id:osn_th:20190129221114p:plain
実行結果を見ると、正しくWebServiceが計算結果を応答として返していることが分かる。
※パラメータに3と5を指定すると、正しく3+5=8の計算結果が応答結果として返されている!

つまり、作成したSOAPサービスが正しくデプロイされ動作していることが確認できた。

まとめ

今回、SOAPサービスをIntelliJ IDEAで一から作成しGradleでwarファイル化する方法を確認した。
また、作ったwarをGlassFishにデプロイし正しく動作していることも確認できた。
SOAPサービスを作成して公開すること自体はこのレベルであればさほど難しくなくできることがわかった。
あとはGlassFishへのデプロイまでGradleから自動化できればより簡単に運用できるようなりそう。

以上!

2019/3/3追記

wsimportを使ってこのSOAPサービスのクライアントコードを自動生成する記事を公開しました。