発生した課題
先日 grailsでrun-appしたらブートしなくなった という記事を書きましたが、gradleで構築する機会があったので参考にしたpathingJarを入れて動かすパターンでやってみたのですが、どうやらクラスパスに空白が含まれているとうまく動かない、ということがわかりました。自分のPCは入社時に予め会社の人がセットアップしてくれたのですが、フルネームで空白が。なので、ホームディレクトリまでのパスに空白が入っています。orz
対処
jarに埋め込むクラスパスは空白区切りです。パスに含まれる空白は%20でエスケープするみたいです。pathingJarのjarファイルのパスをcollectしているところで、空白を置換するようにします。
build.gradle
... 前略 ...
task pathingJar(type: Jar) {
dependsOn configurations.runtime
appendix = 'pathing'
doFirst {
manifest {
attributes "Class-Path": configurations.runtime.files.collect {
it.toURL().toString().replaceFirst(/file:\/+/, '/').replace(' ', '%20')
}.join(' ')
}
}
}
... 後略 ...
Grailsに応用
Grailsでは pathingJar = true という裏技が用意されているのですが、同様に起動しない謎の状況に見舞われました。そこで以下のように記述します。pathingJarのままタスクを書くと既にあるよと怒られるので、pathingJarExタスクとしました。
build.gradle
... 前略 ...
// grails {
// pathingJar = true
// }
task pathingJarEx(type: Jar) {
dependsOn configurations.runtime
appendix = 'pathing'
doFirst {
manifest {
// Build the Class-Path for absolute paths based on runtime dependencies.
attributes(
'Class-Path': configurations.runtime.files.collect {
it.toURL().toString().replaceFirst(/file:\/+/, '/').replace(' ', '%20')
}.join(' ')
)
}
}
exclude { it.file.absolutePath.contains('assetCompile') }
}
... 中略 ...
bootRun {
... 中略 ...
dependsOn pathingJarEx
doFirst {
classpath = files("$buildDir/classes/main", "$buildDir/resources/main", "$projectDir/gsp-classes", pathingJarEx.archivePath)
}
}
... 後略 ...