Spring Boot 1.2.x の Web アプリを 1.3.x へバージョンアップする ( その6 )( JRebel と devtools をどちらも入れた時の動作を確認する )
概要
Spring Boot 1.2.x の Web アプリを 1.3.x へバージョンアップする ( その5 )( 1.2 → 1.3 で実装方法が変更された箇所を修正する ) の続きです。
- 今回の手順で確認できるのは以下の内容です。
- JRebel と devtools をどちらも入れた時の動作を確認する
参照したサイト・書籍
20. Developer tools
http://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-devtools.htmlDevTools in Spring Boot 1.3
https://spring.io/blog/2015/06/17/devtools-in-spring-boot-1-3spring-boot-devtoolsで開発効率上げようぜ、的な。 (Spring Boot 1.3)
http://qiita.com/IsaoTakahashi/items/f99d5f761d1d4190860dDevToolsPropertyDefaultsPostProcessor.java
https://github.com/spring-projects/spring-boot/blob/v1.3.5.RELEASE/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/env/DevToolsPropertyDefaultsPostProcessor.java
目次
- build.gradle を変更する
- application-develop.properties, application-unittest.properties, application-product.properties を修正する
- JRebel と devtools を併用している状態でそれぞれが正常に動作することを確認する
- spring.thymeleaf.cache が IDE で起動した時には false に、java -jar で起動した時には true になることを確認する
- devtools を外して java -jar で起動すると spring.thymeleaf.cache が true になるか確認する
- 次回は。。。
手順
build.gradle を変更する
build.gradle を以下のように変更します。
dependencies {
def jdbcDriver = "org.postgresql:postgresql:9.4.1208"
// dependency-management-plugin によりバージョン番号が自動で設定されるもの
// Appendix A. Dependency versions ( http://docs.spring.io/platform/docs/current/reference/htmlsingle/#appendix-dependency-versions ) 参照
compile("org.springframework.boot:spring-boot-starter-web")
compile("org.springframework.boot:spring-boot-starter-thymeleaf")
compile("org.thymeleaf.extras:thymeleaf-extras-springsecurity4")
compile("org.springframework.boot:spring-boot-starter-data-jpa")
compile("org.springframework.boot:spring-boot-starter-velocity")
compile("org.springframework.boot:spring-boot-starter-mail")
compile("org.springframework.boot:spring-boot-starter-security")
compile("org.springframework.boot:spring-boot-starter-redis")
compile("org.springframework.boot:spring-boot-starter-amqp")
compile("org.springframework.boot:spring-boot-devtools")
compile("org.springframework.session:spring-session")
compile("org.codehaus.janino:janino")
compile("com.fasterxml.jackson.datatype:jackson-datatype-jsr310")
compile("com.fasterxml.jackson.dataformat:jackson-dataformat-xml")
testCompile("org.springframework.boot:spring-boot-starter-test")
testCompile("org.springframework.security:spring-security-test")
testCompile("org.yaml:snakeyaml")
testCompile("org.spockframework:spock-core") {
exclude module: "groovy-all"
}
testCompile("org.spockframework:spock-spring") {
exclude module: "groovy-all"
}
// dependency-management-plugin によりバージョン番号が自動で設定されないもの、あるいは最新バージョンを指定したいもの
runtime("${jdbcDriver}")
compile("org.seasar.doma:doma:2.8.0")
compile("org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4.1:1.16")
compile("org.apache.commons:commons-lang3:3.4")
compile("org.projectlombok:lombok:1.16.8")
compile("com.google.guava:guava:19.0")
compile("org.simpleframework:simple-xml:2.7.1")
compile("com.univocity:univocity-parsers:2.1.1")
compile("org.thymeleaf.extras:thymeleaf-extras-java8time:2.1.0.RELEASE")
testCompile("org.dbunit:dbunit:2.5.1")
testCompile("com.icegreen:greenmail:1.5.0")
testCompile("org.assertj:assertj-core:3.4.1")
testCompile("com.jayway.jsonpath:json-path:2.2.0")
testCompile("org.jmockit:jmockit:1.23")
// for Doma-Gen
domaGenRuntime("org.seasar.doma:doma-gen:2.8.0")
domaGenRuntime("${jdbcDriver}")
}
compile("org.springframework.boot:spring-boot-devtools")を追加します。
変更後、Gradle projects View の左上にある「Refresh all Gradle projects」ボタンをクリックして更新します。
application-develop.properties, application-unittest.properties, application-product.properties を修正する
cache の ON/OFF を設定している部分をコメントアウトします。
■application-develop.properties
spring.datasource.url=jdbc:log4jdbc:postgresql://localhost/ksbylending spring.datasource.username=ksbylending_user spring.datasource.password=xxxxxxxx spring.datasource.driverClassName=net.sf.log4jdbc.sql.jdbcapi.DriverSpy spring.mail.host=localhost spring.mail.port=25 spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.redis.sentinel.master=mymaster spring.redis.sentinel.nodes=localhost:6381,localhost:6382,localhost:6383 #spring.messages.cache-seconds=0 #spring.thymeleaf.cache=false #spring.velocity.cache=false
- 以下の3項目をコメントアウトします。
- spring.messages.cache-seconds=0
- spring.thymeleaf.cache=false
- spring.velocity.cache=false
■application-unittest.properties
spring.datasource.url=jdbc:postgresql://localhost/ksbylending spring.datasource.username=ksbylending_user spring.datasource.password=xxxxxxxx spring.datasource.driverClassName=org.postgresql.Driver spring.mail.host=localhost spring.mail.port=25 spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.redis.sentinel.master=mymaster spring.redis.sentinel.nodes=localhost:6381,localhost:6382,localhost:6383 #spring.thymeleaf.cache=true
- 以下の1項目をコメントアウトします。
- spring.thymeleaf.cache=true
■application-product.properties
server.tomcat.basedir=C:/webapps/ksbysample-webapp-lending logging.file=${server.tomcat.basedir}/logs/ksbysample-webapp-lending.log spring.datasource.url=jdbc:postgresql://localhost/ksbylending spring.datasource.username=ksbylending_user spring.datasource.password=xxxxxxxx spring.datasource.driverClassName=org.postgresql.Driver spring.mail.host=localhost spring.mail.port=25 spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.redis.sentinel.master=mymaster spring.redis.sentinel.nodes=localhost:6381,localhost:6382,localhost:6383 #spring.thymeleaf.cache=true
- 以下の1項目をコメントアウトします。
- spring.thymeleaf.cache=true
JRebel と devtools を併用している状態でそれぞれが正常に動作することを確認する
まずは devtools で Automatic Restart が動作することを確認します。
最初に IntelliJ IDEA の画面右上の「Select Run/Debug Configuration」で「Application」を選択した後、「Run」ボタンをクリックして Tomcat を起動します ( JRebel を使用せずに Tomcat が起動します )。


src/main/java/ksbysample/webapp/lending の下に以下の SampleController.java を作成します。
package ksbysample.webapp.lending; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller @RequestMapping("/sample") public class SampleController { @RequestMapping @ResponseBody public String index() { return "sample"; } }
Ctrl+F9 を押して Compile します。Compile が完了すると devtools の Automatic Restart が実行されました。通常起動時は 18秒ほどかかりましたが、Automatic Restart だと 7秒程度で再起動が完了します。


http://localhost:8080/sample/ にアクセスすると "sample" の文字が表示されることが確認できます。JRebel を使用していないのに新規に 作成した Controller クラスが反映されるとは便利ですね。

Tomcat を停止します。
次に JRebel が動作することを確認します。
IntelliJ IDEA の画面右上の「Select Run/Debug Configuration」で「Application」を選択した後、「Run with JRebel」ボタンをクリックして Tomcat を起動します。


src/main/java/ksbysample/webapp/lending の下の SampleController.java を以下のように変更します。
package ksbysample.webapp.lending; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller @RequestMapping("/sample") public class SampleController { @RequestMapping @ResponseBody public String index() { return "test"; } }
return "sample";→return "test";へ変更します。
Ctrl+F9 を押して Compile します。Compile が完了すると JRebel: Reloading class 'ksbysample.webapp.lending.SampleController'. のメッセージが出力されて JRebel が class をリロードしました。また devtools の Automatic Restart が実行されている時のようなログは出力されませんでした。JRebel は変更のあったクラスだけをリロードしているようなので、リロードにかかる時間はこちらの方が速いですね。

http://localhost:8080/sample/ にアクセスすると "test" の文字が表示されることが確認できます。

devtools が入っていても JRebel の動作には影響ないようです。
spring.thymeleaf.cache が IDE で起動した時には false に、java -jar で起動した時には true になることを確認する
20. Developer tools を見ると java -jar で起動したら devtools は自動的に disable になるらしいので、spring.thymeleaf.cache が true になるのか確認したいと思います。
spring.thymeleaf.cache の値を確認できるよう、src/main/java/ksbysample/webapp/lending の下の SampleController.java を以下のように変更します。
package ksbysample.webapp.lending; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller @RequestMapping("/sample") public class SampleController { @Value("${spring.thymeleaf.cache:}") private String springThymeleafCache; @RequestMapping @ResponseBody public String index() { return "spring.thymeleaf.cache = " + springThymeleafCache; } }
まずは IntelliJ IDEA から Tomcat を起動した場合には false と表示されることを確認します。
IntelliJ IDEA の画面右上の「Select Run/Debug Configuration」で「Application」を選択した後、「Run」ボタンをクリックして Tomcat を起動します ( JRebel を使用せずに Tomcat が起動します )。
http://localhost:8080/sample/ にアクセスすると spring.thymeleaf.cache = false と表示されることが確認できます。

Tomcat を停止します。
JRebel で Tomcat を起動した時も false と表示されるのか確認してみます。
IntelliJ IDEA の画面右上の「Select Run/Debug Configuration」で「Application」を選択した後、「Run with JRebel」ボタンをクリックして Tomcat を起動します。
http://localhost:8080/sample/ にアクセスすると同じように spring.thymeleaf.cache = false と表示されることが確認できます。

Tomcat を停止します。
今度は jar ファイルを作成して java -jar で起動した時に true と表示されることを確認します。
Gradle projects View から clean タスクの実行→「Rebuild Project」メニューの実行→build タスクの実行を行い、ksbysample-webapp-lending-1.1.0-RELEASE.jar を作成します。

ksbysample-webapp-lending-1.1.0-RELEASE.jar を C:\webapps\ksbysample-webapp-lending\lib の下へコピーします。
C:\webapps\ksbysample-webapp-lending\bat の下の webapp_startup.bat を以下のように変更します。
@echo on
setlocal
set JAVA_HOME=C:\Java\jdk1.8.0_92
set PATH=%JAVA_HOME%\bin;%PATH%
set WEBAPP_HOME=C:\webapps\ksbysample-webapp-lending
set WEBAPP_JAR=ksbysample-webapp-lending-1.1.0-RELEASE.jar
cd /d %WEBAPP_HOME%
java -server ^
-Xms1024m -Xmx1024m ^
-XX:MaxMetaspaceSize=384m ^
-XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled ^
-XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=75 ^
-XX:+ScavengeBeforeFullGC -XX:+CMSScavengeBeforeRemark ^
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps ^
-Xloggc:%WEBAPP_HOME%/logs/gc.log ^
-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=10M ^
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=%WEBAPP_HOME%/logs/`date`.hprof ^
-XX:ErrorFile=%WEBAPP_HOME%/logs/hs_err_pid_%p.log ^
-Dsun.net.inetaddr.ttl=100 ^
-Dcom.sun.management.jmxremote ^
-Dcom.sun.management.jmxremote.port=7900 ^
-Dcom.sun.management.jmxremote.ssl=false ^
-Dcom.sun.management.jmxremote.authenticate=false ^
-Dspring.profiles.active=product ^
-jar lib\%WEBAPP_JAR%
set JAVA_HOME=C:\Java\jdk1.8.0_77→set JAVA_HOME=C:\Java\jdk1.8.0_92へ変更します。set WEBAPP_JAR=ksbysample-webapp-lending-1.0.0-RELEASE.jar→set WEBAPP_JAR=ksbysample-webapp-lending-1.1.0-RELEASE.jarへ変更します。
webapp_startup.bat を実行します。

http://localhost:8080/sample/ にアクセスすると spring.thymeleaf.cache = false と表示されました。javar -jar で起動したのに true になりませんね。。。

webapp_startup.bat 実行時に開いたコマンドプロンプトを閉じます。
devtools を外して java -jar で起動すると spring.thymeleaf.cache が true になるか確認する
devtools を外したら spring.thymeleaf.cache がどう表示されるのか確認してみます。
build.gradle の compile("org.springframework.boot:spring-boot-devtools") の行をコメントアウトします。変更後、Gradle projects View の左上にある「Refresh all Gradle projects」ボタンをクリックして更新します。
Gradle projects View から clean タスクの実行→「Rebuild Project」メニューの実行→build タスクの実行を行い、ksbysample-webapp-lending-1.1.0-RELEASE.jar を作成し直します。
ksbysample-webapp-lending-1.1.0-RELEASE.jar を C:\webapps\ksbysample-webapp-lending\lib の下へコピーした後、webapp_startup.bat を実行します。
http://localhost:8080/sample/ にアクセスすると今度は spring.thymeleaf.cache = と表示されました。Appendix A. Common application properties を見ると spring.thymeleaf.cache=true # Enable template caching. と記載されていますので、未設定時は true になっていると考えてよいでしょう。

webapp_startup.bat 実行時に開いたコマンドプロンプトを閉じます。
build.gradle の compile("org.springframework.boot:spring-boot-devtools") のコメントアウトも元に戻して、変更後、Gradle projects View の左上にある「Refresh all Gradle projects」ボタンをクリックして更新しておきます。
次回は。。。
java -jar で起動しても spring.thymeleaf.cache = false になる原因を調査します。DevToolsPropertyDefaultsPostProcessor.java を見ると remoteUrl が null だと spring.thymeleaf.cache = false が設定されるようなのですが、remoteUrl とは何でしょうか?
ソースコード
履歴
2016/05/28
初版発行。