非jar配置文件上的Gradle依赖目标

时间:2013-02-22 18:49:58

标签: gradle

我可以创建一个依赖于jar文件之外的东西,如下所示:

dependencies {
    compile files("../other-project/config.txt")
}

以上工作正常,但config.txt最终在我的war文件的WEB-INF / lib文件夹中。相反,我需要它在war文件中的WEB-INF / classes中,以及用于jettyRun的src / main / resources中。

如何控制依赖关系的结束位置?或者我是以错误的方式解决这个问题?

我也可以通过复制任务来解决这个问题,但这确实是一种依赖关系,因为我不需要更新文件,除非它发生变化。无条件的副本可行,但我宁愿以正确的方式做到这一点。

3 个答案:

答案 0 :(得分:1)

假设您已使用以下目录和文件结构配置了多项目构建:

/combined-war
    /main-project
        /src
            /webapp
                /WEB-INF
                    web.xml
        build.gradle
    /other-project
        /resources
            /WEB-INF
                /classes
                    config.txt
        build.gradle
    build.gradle

为了允许jettyRunwebapp main-project目录的内容与resourcesother-project目录的内容合并,您需要为build.gradle main-project apply plugin: 'java' apply plugin: 'war' apply plugin: 'jetty' import org.gradle.api.plugins.jetty.internal.JettyPluginWebAppContext def newResourceCollection(File... resources) { def script = ''' import org.mortbay.resource.ResourceCollection new ResourceCollection(resources) ''' def shell = new GroovyShell(JettyPluginWebAppContext.class.classLoader) shell.setProperty("resources", resources as String[]) return shell.evaluate(script) } jettyRun.doFirst { jettyRun.webAppConfig = new JettyPluginWebAppContext() jettyRun.webAppConfig.baseResource = newResourceCollection( // list the folders that should be combined file(webAppDirName), file("${project(':other-project').projectDir}/resources") ) } war { from("${project(':other-project').projectDir}/resources") } 添加一个变通方法(我已经修改了用户siasia on gist发布的那个)。

将相同的目录内容添加到war文件非常简单,并在Gradle User GuideDSL reference中进行了记录。

gradle jettyRun

每当执行ResourceCollection时,都会创建一个组合给定目录的新other-project。每个默认的Jetty锁(至少在Windows上)锁定它所服务的所有文件。因此,如果您想在Jetty运行时编辑这些文件,请查看following solutions

<强>更新

由于build.gradle在这种情况下不是另一个Gradle项目,jettyRun.doFirst { jettyRun.webAppConfig = new JettyPluginWebAppContext() jettyRun.webAppConfig.baseResource = newResourceCollection( file(webAppDirName), file("$projectDir/../other-project/resources") ) } war { from("$projectDir/../other-project/resources") } 中的两个任务应如下所示:

config.txt

我不知道任何只添加一个文件的解决方案(例如{{1}})。您将始终必须添加完整的目录。

答案 1 :(得分:1)

war任务(由war插件配置)将依赖项放入WEB-INF/lib,将Web项目自己的代码/资源放入WEB-INF/classes,以及Web应用程序内容(默认情况下会将src/main/webapp)转换为WEB-INF。可以通过显式配置war任务来添加其他内容。例如:

war {
    into("WEB-INF/classes") {
        from "../other-project/config.txt"
    }
}

使用嵌入式Jetty(尽管在开发过程中可能不是最方便)的一种方法是使用jettyRunWar而不是jettyRun。想到的另一个解决方案,特别是如果要添加的内容驻留在其自己的目录中,则将该目录声明为Web项目的附加资源目录(sourceSets.main.resources.srcDir "../other-project/someResourceDir")。实际上,这是配置war任务的替代方法。如果Web项目已经依赖于另一个项目,则可以为该项目配置一个额外的资源目录。

答案 2 :(得分:0)

正如我上面提到的,做一个解决问题的无条件副本很简单。同样,不是我最初提出的问题。但这是我的解决方案,适用于war和jettyRun任务:

processResources.doFirst {
    copy {
        from '../other-project/config.txt'
        into 'src/main/resources'
    }
}