| /* |
| * Copyright 2004-2005 the original author or authors. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| import org.codehaus.groovy.control.CompilerConfiguration |
| import org.springframework.core.io.FileSystemResource |
| import org.codehaus.groovy.grails.plugins.GrailsPluginUtils |
| |
| /** |
| * Gant script containing the Grails classpath setup. |
| * |
| * @author Peter Ledbrook |
| * |
| * @since 1.1 |
| */ |
| |
| // No point doing this stuff more than once. |
| if (getBinding().variables.containsKey("_grails_classpath_called")) return |
| _grails_classpath_called = true |
| |
| includeTargets << grailsScript("_GrailsSettings") |
| |
| classpathSet = false |
| includePluginJarsOnClasspath = true |
| |
| target(classpath: "Sets the Grails classpath") { |
| setClasspath() |
| } |
| |
| /** |
| * Obtains all of the plug-in Lib directories |
| */ |
| getPluginLibDirs = { |
| GrailsPluginUtils.getPluginLibDirectories(pluginsHome, resolveResources) |
| } |
| |
| /** |
| * Obtains an array of all plug-in JAR files as Spring Resource objects |
| */ |
| getPluginJarFiles = { |
| GrailsPluginUtils.getPluginJarFiles(pluginsHome, resolveResources) |
| } |
| |
| getJarFiles = {-> |
| def jarFiles = resolveResources("file:${basedir}/lib/*.jar").toList() |
| if(includePluginJarsOnClasspath) { |
| |
| def pluginJars = getPluginJarFiles() |
| |
| for (pluginJar in pluginJars) { |
| boolean matches = jarFiles.any {it.file.name == pluginJar.file.name} |
| if (!matches) jarFiles.add(pluginJar) |
| } |
| } |
| |
| def userJars = resolveResources("file:${userHome}/.grails/lib/*.jar") |
| for (userJar in userJars) { |
| jarFiles.add(userJar) |
| } |
| |
| jarFiles.addAll(getExtraDependencies()) |
| |
| jarFiles |
| } |
| |
| getExtraDependencies = { |
| def jarFiles =[] |
| if(buildConfig?.grails?.compiler?.dependencies) { |
| def extraDeps = ant.fileScanner(buildConfig.grails.compiler.dependencies) |
| for(jar in extraDeps) { |
| jarFiles << new FileSystemResource(jar) |
| } |
| } |
| jarFiles |
| } |
| |
| populateRootLoader = {rootLoader, jarFiles -> |
| for(jar in getExtraDependencies()) { |
| rootLoader?.addURL(jar.URL) |
| } |
| rootLoader?.addURL(new File("${basedir}/web-app/WEB-INF").toURI().toURL()) |
| } |
| |
| // Only used by "grailsClasspath" closure. |
| //defaultCompilerDependencies = { antBuilder -> |
| // if (antBuilder) { |
| // delegate = antBuilder |
| // resolveStrategy = Closure.DELEGATE_FIRST |
| // } |
| // |
| // grailsSettings.compileDependencies?.each { file -> |
| // file(file: file.absolutePath) |
| // } |
| // |
| // if (new File("${basedir}/lib").exists()) { |
| // fileset(dir: "${basedir}/lib") |
| // } |
| //} |
| |
| commonClasspath = { |
| def grailsDir = resolveResources("file:${basedir}/grails-app/*") |
| for (d in grailsDir) { |
| pathelement(location: "${d.file.absolutePath}") |
| } |
| |
| def pluginLibDirs = getPluginLibDirs().findAll { it.exists() } |
| for (pluginLib in pluginLibDirs) { |
| fileset(dir: pluginLib.file.absolutePath) |
| } |
| } |
| |
| compileClasspath = { |
| commonClasspath.delegate = delegate |
| commonClasspath.call() |
| |
| grailsSettings.compileDependencies?.each { File f -> |
| file(file: f.absolutePath) |
| } |
| } |
| |
| testClasspath = { |
| commonClasspath.delegate = delegate |
| commonClasspath.call() |
| |
| grailsSettings.testDependencies?.each { File f -> |
| file(file: f.absolutePath) |
| } |
| |
| pathelement(location: "${classesDir.absolutePath}") |
| } |
| |
| runtimeClasspath = { |
| commonClasspath.delegate = delegate |
| commonClasspath.call() |
| |
| grailsSettings.runtimeDependencies?.each { File f -> |
| file(file: f.absolutePath) |
| } |
| |
| pathelement(location: "${classesDir.absolutePath}") |
| } |
| |
| /** |
| * Converts an Ant path into a list of URLs. |
| */ |
| classpathToUrls = { String classpathId -> |
| def propName = "converted.classpath" |
| ant.pathconvert(refid: classpathId, dirsep: "/", pathsep: ":", property: propName) |
| |
| return ant.project.properties.get(propName).split(":").collect { new File(it).toURI().toURL() } |
| } |
| |
| // I don't think this is needed anymore, but keeping around just in |
| // case the paths specified are actually important! |
| // |
| //grailsClasspath = {pluginLibs, grailsDir -> |
| // pathelement(location: "${classesDir.absolutePath}") |
| // pathelement(location: "${basedir}/test/unit") |
| // pathelement(location: "${basedir}/test/integration") |
| // pathelement(location: "${basedir}") |
| // pathelement(location: "${basedir}/web-app") |
| // pathelement(location: "${basedir}/web-app/WEB-INF") |
| // pathelement(location: "${basedir}/web-app/WEB-INF/classes") |
| // |
| // if (new File("${basedir}/web-app/WEB-INF/lib").exists()) { |
| // fileset(dir: "${basedir}/web-app/WEB-INF/lib") |
| // } |
| // for (d in grailsDir) { |
| // pathelement(location: "${d.file.absolutePath}") |
| // } |
| // |
| // if(preInitConfig.grails.compiler.dependencies) { |
| // def callable = preInitConfig.grails.compiler.dependencies |
| // callable.delegate = delegate |
| // callable.resolveStrategy = Closure.DELEGATE_FIRST |
| // callable() |
| // } |
| // else { |
| // defaultCompilerDependencies(delegate) |
| // } |
| //} |
| |
| void setClasspath() { |
| // Make sure the following code is only executed once. |
| if (classpathSet) return |
| |
| ant.path(id: "grails.compile.classpath", compileClasspath) |
| ant.path(id: "grails.test.classpath", testClasspath) |
| ant.path(id: "grails.runtime.classpath", runtimeClasspath) |
| |
| def grailsDir = resolveResources("file:${basedir}/grails-app/*") |
| StringBuffer cpath = new StringBuffer("") |
| |
| def jarFiles = getJarFiles() |
| |
| |
| for (dir in grailsDir) { |
| cpath << dir.file.absolutePath << File.pathSeparator |
| // Adding the grails-app folders to the root loader causes re-load issues as |
| // root loader returns old class before the grails GCL attempts to recompile it |
| //rootLoader?.addURL(dir.URL) |
| } |
| cpath << classesDirPath << File.pathSeparator |
| cpath << "${basedir}/web-app/WEB-INF" |
| for (jar in jarFiles) { |
| cpath << jar.file.absolutePath << File.pathSeparator |
| } |
| |
| // We need to set up this configuration so that we can compile the |
| // plugin descriptors, which lurk in the root of the plugin's project |
| // directory. |
| compConfig = new CompilerConfiguration() |
| compConfig.setClasspath(cpath.toString()); |
| compConfig.sourceEncoding = "UTF-8" |
| |
| // rootLoader?.addURL(new File("${basedir}/grails-app/conf/hibernate").toURI().toURL()) |
| // rootLoader?.addURL(new File("${basedir}/src/java").toURI().toURL()) |
| |
| // The resources directory must be created before it is added to |
| // the root loader, otherwise it is quietly ignored. In other words, |
| // if the directory is created after its path has been added to the |
| // root loader, it will not be included in the classpath. |
| def resourcesDir = new File(resourcesDirPath) |
| if (!resourcesDir.exists()) { |
| resourcesDir.mkdirs() |
| } |
| rootLoader?.addURL(resourcesDir.toURI().toURL()) |
| |
| classpathSet = true |
| } |