@@ -13,8 +13,10 @@ import org.gradle.api.Plugin
1313import org.gradle.api.Project
1414import org.gradle.api.Task
1515import org.gradle.api.artifacts.Configuration
16+ import org.gradle.api.artifacts.ConfigurationContainer
1617import org.gradle.api.artifacts.Dependency
1718import org.gradle.api.file.CopySpec
19+ import org.gradle.api.java.archives.Manifest
1820import org.gradle.api.plugins.GroovyPlugin
1921import org.gradle.api.tasks.AbstractCopyTask
2022import org.gradle.api.tasks.JavaExec
@@ -35,6 +37,8 @@ import org.grails.gradle.plugin.run.FindMainClassTask
3537import org.grails.gradle.plugin.util.SourceSets
3638import org.grails.io.support.FactoriesLoaderSupport
3739import org.springframework.boot.gradle.SpringBootPluginExtension
40+ import org.apache.tools.ant.taskdefs.condition.Os
41+
3842
3943import javax.inject.Inject
4044
@@ -83,6 +87,8 @@ class GrailsGradlePlugin extends GroovyPlugin {
8387 configureApplicationCommands(project)
8488
8589 createBuildPropertiesTask(project)
90+
91+ configurePathingJar(project)
8692 }
8793
8894 protected Task createBuildPropertiesTask (Project project ) {
@@ -407,4 +413,63 @@ class GrailsGradlePlugin extends GroovyPlugin {
407413 native2asciiTask
408414 }
409415
416+ protected Jar createPathingJarTask (Project project , String name , Configuration ...configurations ) {
417+ File assets = new File (project. buildDir, ' assets' )
418+
419+ project. tasks. create(name, Jar ) { Jar task ->
420+ task. dependsOn(configurations)
421+ task. appendix = ' pathing'
422+
423+ Set files = []
424+ configurations. each {
425+ files. addAll(it. files)
426+ }
427+
428+ task. doFirst {
429+ manifest { Manifest manifest ->
430+ manifest. attributes " Class-Path" : files. collect { File file ->
431+ file. toURI(). toURL(). toString(). replaceFirst(/ file:\/ +/ , ' /' )
432+ }. join(' ' )
433+ }
434+ }
435+
436+ // assetCompile will be execute for all Jar-type tasks
437+ // (see https://github.com/bertramdev/asset-pipeline/blob/master/asset-pipeline-gradle/src/main/groovy/asset/pipeline/gradle/AssetPipelinePlugin.groovy#L85)
438+ // exclude the assets from pathing jar
439+ task. exclude {
440+ it. file. absolutePath. startsWith(assets. absolutePath)
441+ }
442+ }
443+ }
444+
445+ protected void configurePathingJar (Project project ) {
446+ project. afterEvaluate {
447+ ConfigurationContainer configurations = project. configurations
448+ Configuration runtime = configurations. getByName(' runtime' )
449+ Configuration console = configurations. getByName(' console' )
450+
451+ Jar pathingJar = createPathingJarTask(project, " pathingJar" , runtime)
452+ Jar pathingJarCommand = createPathingJarTask(project, " pathingJarCommand" , runtime, console)
453+
454+ GrailsExtension grailsExt = project. extensions. getByType(GrailsExtension )
455+
456+ if (grailsExt. pathingJar && Os . isFamily(Os . FAMILY_WINDOWS )) {
457+
458+ TaskContainer tasks = project. tasks
459+
460+ tasks. withType(JavaExec ) { JavaExec task ->
461+ task. dependsOn(pathingJar)
462+ task. doFirst {
463+ classpath = project. files(" ${ project.buildDir} /classes/main" , " ${ project.buildDir} /resources/main" , " ${ project.projectDir} /gsp-classes" , pathingJar. archivePath)
464+ }
465+ }
466+
467+ tasks. withType(ApplicationContextCommandTask ) { ApplicationContextCommandTask task ->
468+ task. dependsOn(pathingJarCommand)
469+ task. systemProperties = [' grails.env' : ' development' ]
470+ }
471+ }
472+ }
473+ }
474+
410475}
0 commit comments