@@ -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,54 @@ class GrailsGradlePlugin extends GroovyPlugin {
407413 native2asciiTask
408414 }
409415
416+ protected Jar createPathingJarTask (Project project , String name , Configuration ...configurations ) {
417+ project. tasks. create(name, Jar ) { Jar task ->
418+ task. dependsOn(configurations)
419+ task. appendix = ' pathing'
420+
421+ Set files = []
422+ configurations. each {
423+ files. addAll(it. files)
424+ }
425+
426+ task. doFirst {
427+ manifest { Manifest manifest ->
428+ manifest. attributes " Class-Path" : files. collect { File file ->
429+ file. toURI(). toURL(). toString(). replaceFirst(/ file:\/ +/ , ' /' )
430+ }. join(' ' )
431+ }
432+ }
433+ }
434+ }
435+
436+ protected void configurePathingJar (Project project ) {
437+ project. afterEvaluate {
438+ ConfigurationContainer configurations = project. configurations
439+ Configuration runtime = configurations. getByName(' runtime' )
440+ Configuration console = configurations. getByName(' console' )
441+
442+ Jar pathingJar = createPathingJarTask(project, " pathingJar" , runtime)
443+ Jar pathingJarCommand = createPathingJarTask(project, " pathingJarCommand" , runtime, console)
444+
445+ GrailsExtension grailsExt = project. extensions. getByType(GrailsExtension )
446+
447+ if (grailsExt. pathingJar && Os . isFamily(Os . FAMILY_WINDOWS )) {
448+
449+ TaskContainer tasks = project. tasks
450+
451+ tasks. withType(JavaExec ) { JavaExec task ->
452+ task. dependsOn(pathingJar)
453+ task. doFirst {
454+ classpath = project. files(" ${ project.buildDir} /classes/main" , " ${ project.buildDir} /resources/main" , " ${ project.projectDir} /gsp-classes" , pathingJar. archivePath)
455+ }
456+ }
457+
458+ tasks. withType(ApplicationContextCommandTask ) { ApplicationContextCommandTask task ->
459+ task. dependsOn(pathingJarCommand)
460+ task. systemProperties = [' grails.env' : ' development' ]
461+ }
462+ }
463+ }
464+ }
465+
410466}
0 commit comments