LoginSignup
1
0

More than 5 years have passed since last update.

[gradle] クラスパスに空白が含まれる場合にpathingJarが効かない

Last updated at Posted at 2019-03-06

発生した課題

先日 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)
    }
}
... 後略 ...

参考

grailsでrun-appしたらブートしなくなった

[Gradle] Createprocess error=206 への対処 [備忘録]

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0