grails のアップグレード時のメモ
色々機能を入れていたので、アップグレードをする場合は適宜必要な箇所だけピックアップしてみて下さい。
1. 最初に 3.3.5 で新しいプロジェクトを作成する
1 2 3 4 |
$ sdk use grails 3.3.5 $ grails create-app newversion_project |
以降、新しいプロジェクトを、 newversion_project
古いプロジェクトを、 oldproject という名前で呼ぶ
2. 古い2.x 仕様の物を3.x 仕様にする
2.1. grails-app/conf/BuildConfig.groovy を変更
BuildConfig.groovy は、build.gradle と application.yml に分割される
旧:BuildConfig.groovy
1 2 3 |
grails.server.port.http = 8081 |
↓
新:application.yml
1 2 3 4 |
server: port: 8081 |
旧:BuildConfig.groovy
1 2 3 4 5 |
grails.project.dependency.resolution = { dependencies { runtime 'mysql:mysql-connector-java:5.1.29' |
↓
新:build.gradle
1 2 3 4 |
dependencies { runtime "mysql:mysql-connector-java:8.0.11" |
旧:BuildConfig.groovy
1 2 3 4 5 |
grails.project.dependency.resolution = { plugins { compile ":spring-security-core:2.0-RC2" |
↓
新:build.gradle
1 2 3 4 |
dependencies { compile "org.grails.plugins:spring-security-core:3.3.1" |
旧:BuildConfig.groovy
1 2 3 4 5 |
grails.project.dependency.resolution = { plugins { compile ":export:1.6" |
↓
新:build.gradle
1 2 3 4 |
dependencies { compile "org.grails.plugins:export:2.0.0" |
旧:BuildConfig.groovy
1 2 3 4 5 |
grails.project.dependency.resolution = { plugins { runtime ':elasticsearch:0.0.4.4' |
↓
新:build.gradle
1 2 3 4 |
dependencies { compile "org.grails.plugins:export:2.0.0" |
旧:BuildConfig.groovy
1 2 3 4 5 |
grails.project.dependency.resolution = { plugins { compile ':quartz:1.0.1' |
↓
新:build.gradle
1 2 3 4 |
dependencies { compile 'org.grails.plugins:quartz:2.0.13' |
2.2. ソースの移動
grails-app 配下をコピー
1 2 3 |
cp -pr ./oldproject/grails-app/* ./newversion_project/grails-app/ |
srcのコピー
1 2 3 4 |
cp -pr ./oldproject/src/groovy/ ./newversion_project/src/main/groovy cp -pr ./oldproject/src/java/* ./newversion_project/src/main/groovy/ |
test のコピー
1 2 3 |
cp -pr ./oldproject/test/unit/* ./newversion_project/src/test/groovy |
integration のテストのコピー
1 2 3 |
cp -pr ./oldproject/test/integration/* ./newversion_project/src/integration-test/groovy/ |
2.3. ソース内のパッケージ等
それぞれ、旧を新に変更する
旧
1 2 3 |
org.codehaus.groovy.grails.orm.hibernate.cfg.GrailsAnnotationConfiguration |
↓
新
1 2 3 |
org.grails.orm.hibernate.HibernateMappingContextConfiguration |
旧
1 2 3 |
import org.codehaus.groovy.grails.web.mapping.RegexUrlMapping |
↓
新
1 2 3 |
import org.grails.web.mapping.RegexUrlMapping |
旧
1 2 3 |
import org.grails.databinding.BindingFormat |
↓
新
1 2 3 |
import grails.databinding.BindingFormat |
2.4. liquibase.util.csv.CSVReader
liquidbase を使っていたので、build.gradle をインポート
#build.gradle
1 2 3 4 |
dependencies { compile 'org.liquibase:liquibase-core:3.8.8' |
2.5. Validateable のアノテーション変更
@grails.validation.Validateable は、
annotaion じゃなく、trait に変わったので変更
@grails.validation.Validateable と記載があるところは削除して以下を入れる
1 2 3 4 |
import grails.validation.Validateable class Someclass implements Validateable |
2.6. grailsApplication は自動injectされる
controller にある、
def grailsApplication
は不要。自動的にinjectされるので記載を削除
2.7. test のソース変更
アノテーションではなく、traitをつかようになったので変更
以下のような試験は
1 2 3 4 5 |
@TestFor(CustomerController) @Mock(SomeDomain) class CustomerControllerSpec extends Specification { |
以下に変更する
1 2 3 4 5 6 7 |
import grails.testing.gorm.DomainUnitTest import grails.testing.web.controllers.ControllerUnitTest class CustomerControllerSpec extends Specification implements ControllerUnitTest, DomainUnitTest{ |
TestMixin を使ってる箇所場合は、build.gradle にライブラリを追加
新:build.gradle
1 2 3 4 |
dependencies { testCompile "org.grails:grails-test-mixins:3.3.0" |
2.8. grails-app/conf/Config.groovy を、grails-app/conf/application.groovy へ。
application.groovy は、create-app では作成されるないので自分で作成
旧: Config.groovy
1 2 3 |
grails.gorm.failOnError = true |
↓
新: application.groovy
1 2 3 |
grails.gorm.failOnErrorPackages = true |
2.8.1. spring-security 関連の設定
Config.groovy にある、
grails.plugin.springsecurity. から始まる物を、application.groovy に移動
2.8.2. elasticSearch 関連の設定
elasticSearch plugin を使っていたので設定を移動
Config.groovy にある、
elasticSearch {} を全てコピー
2.8.3. grails-app/conf/DataSource.groovy を、grails-app/conf/application.yml へ
ディフォルトで作成されている、
1 2 3 4 5 |
--- hibernate: cache: |
以下の部分から、DataSource.groovy の groovy 形式を ymlに変換しながらコピー
ただし以下の記載は
1 2 3 |
driverClassName: com.mysql.jdbc.Driver |
以下に変更
1 2 3 |
driverClassName: com.mysql.cj.jdbc.Driver |
2.8.4. grails-app/conf/QuartzConfig.groovy
quartz plugin を使っていたので設定を移動
application.yml に入れる
旧: grails-app/conf/QuartzConfig.groovy
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
quartz { autoStartup = true jdbcStore = false waitForJobsToCompleteOnShutdown = false exposeSchedulerInRepository = false props { scheduler.skipUpdateCheck = true } } environments { test { quartz { autoStartup = false } } development { quartz { autoStartup = true } } } |
↓
新: grails-app/conf/application.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
--- quartz: autoStartup : true jdbcStore : false waitForJobsToCompleteOnShutdown : false exposeSchedulerInRepository : false props : scheduler.skipUpdateCheck : true environments : test : quartz : autoStartup : false development : quartz : autoStartup : true |
2.8.5. grails-app/conf/BootStrap.groovy の変更
/grails-app/init/${package_name}/BootStrap.groovy に移動
${package_name} は、
application.yml の
1 2 3 4 5 6 |
grails: profile: web codegen: defaultPackage: package_name |
に合わせる
2.9. 不要なソースを削除
- grails-app/conf/BuildConfig.groovy
- grails-app/conf/Config.groovy
- grails-app/conf/QuartzConfig.groovy
- grails-app/conf/DataSource.groovy
- grails-app/conf/BootStrap.groovy
- grails-app/conf/UrlMappings.groovy
必要なら、./grails-app/controllers/${package_name}/UrlMappings.groovy に移動
${package_name} は、
application.yml の
1 2 3 4 5 6 |
grails: profile: web codegen: defaultPackage: package_name |
2.10. web.xml
src/templates/war/web.xml でローカル環境でのセッションの時間を変更していたので、これを変更
旧: web.xml
1 2 3 4 5 |
<session-config> <session-timeout>60</session-timeout> </session-config> |
↓
新: grails-app/conf/application.yml
1 2 3 4 5 |
server: session: timeout: 3600 # 60min |
2.11. static なファイルの移動
1 2 3 4 5 6 7 |
cp -pn ./oldproject/web-app/css/* ./newversion_project/grails-app/assets/stylesheets/ cp -pn ./oldproject/web-app/js/* ./newversion_project/grails-app/assets/javascripts/ cp -rpn ./oldproject/web-app/images/* ./newversion_project/grails-app/assets/images/ mkdir ./newversion_project/grails-app/assets/print/ cp -rpn ./oldproject/web-app/print/ ./newversion_project/grails-app/assets/print |
2.12. templates の移動
scaffold のテンプレートを変更してる場合は、
新しプロジェクトの方で、scaffold の templates を生成して手動で変更した方が良い。
ソースをそのまま移動しても簡単には動かなかった。
1 2 3 4 |
$ cd ./newversion_project/ $ grails install-templates |
して、templates を前のプロジェクトの物と比較しながら、手動で変更
2.13. springsecurity plugin の更新
https://grails-plugins.github.io/grails-spring-security-core/3.2.x/index.html#tutorials
この、 tutorials みて真似をするか、
grails s2-quickstart を実行して、現在のdomainと統合していく。
ポイントとしては、
パスワードの作成が、以前は、Userドメインの内部で、
encodePassword()
を呼び出していたが、新しいのは
UserPasswordEncoderListener
を作成して、そこ経由でパスワードのencodeをしている。
以前のuserドメイン
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
def beforeInsert() { encodePassword() } def beforeUpdate() { if (isDirty('password')) { encodePassword() } } protected void encodePassword() { password = springSecurityService?.passwordEncoder ? springSecurityService.encodePassword(password) : password // def saltedPass = "b" + username + "st" // password = springSecurityService.encodePassword(password, saltedPass) // password = springSecurityService.encodePassword(password, username) // password = springSecurityService.encodePassword(password, username) } |
新しいバージョンでは、UserPasswordEncoderListener を作成してそこでパスワードのencode処理をしている