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
初版発行。