3

我可以创建对 jar 文件以外的其他内容的依赖项,如下所示:

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

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

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

我也可以通过复制任务来解决这个问题,但这确实是一个依赖项,因为除非文件发生更改,否则我不需要更新文件。无条件复制会起作用,但我宁愿以正确的方式这样做。

4

3 回答 3

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

为了允许jettyRun将目录的内容与webapp目录的内容相结合,您需要为您的目录添加一种解决方法main-projectresources我已经改编了用户siasia 在 gist 上发布的解决方法)。other-projectbuild.gradlemain-project

将相同的目录内容添加到 war 文件非常简单,并在Gradle 用户指南DSL 参考中进行了说明。

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")
}

每当您执行时,都会创建一个结合给定目录gradle jettyRun的新目录。ResourceCollection默认情况下,Jetty 会锁定(至少在 Windows 上)它所服务的所有文件。因此,如果您想在 Jetty 运行时编辑这些文件,请查看以下解决方案

更新

由于other-project在这种情况下不是另一个 Gradle 项目,因此其中的两个任务build.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)。您总是需要添加一个完整的目录。

于 2013-02-23T00:48:36.960 回答
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 项目已经依赖于另一个项目,则可以改为为该项目配置一个额外的资源目录。

于 2013-02-23T01:31:36.120 回答
0

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

processResources.doFirst {
    copy {
        from '../other-project/config.txt'
        into 'src/main/resources'
    }
}
于 2013-02-23T17:11:48.437 回答