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チェック項目がない
Project name等は適当に
続いてこのプロジェクトを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上で見るとこんなかんじ。
Gradleでwarファイル作成
build.gradleを以下のように編集し、warプラグインを利用可能にする。
※plugins
にid ‘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を選択する。
デプロイしたらsoapappのリンクを開くと、一番下のAcitonにView Endpoint
というリンクがあるのでそこを開く。
WSDLが確認できる。
/soapapp1315251054544753865/AppService?wsdl
このリンクをさらにたどると、以下のようなリンクが表示されるのでそこから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エンドポイントを指定する。
SOAPサービスが認識されるので、addサービスにパラメータを指定して実行する。
実行結果を見ると、正しくWebServiceが計算結果を応答として返していることが分かる。
※パラメータに3と5を指定すると、正しく3+5=8の計算結果が応答結果として返されている!
つまり、作成したSOAPサービスが正しくデプロイされ動作していることが確認できた。
まとめ
今回、SOAPサービスをIntelliJ IDEAで一から作成しGradleでwarファイル化する方法を確認した。
また、作ったwarをGlassFishにデプロイし正しく動作していることも確認できた。
SOAPサービスを作成して公開すること自体はこのレベルであればさほど難しくなくできることがわかった。
あとはGlassFishへのデプロイまでGradleから自動化できればより簡単に運用できるようなりそう。
以上!
2019/3/3追記
wsimportを使ってこのSOAPサービスのクライアントコードを自動生成する記事を公開しました。