假设您已经配置了具有以下目录和文件结构的多项目构建:
/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-project
(resources
我已经改编了用户siasia 在 gist 上发布的解决方法)。other-project
build.gradle
main-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
)。您总是需要添加一个完整的目录。