我可以创建一个依赖于jar文件之外的东西,如下所示:
dependencies {
compile files("../other-project/config.txt")
}
以上工作正常,但config.txt最终在我的war文件的WEB-INF / lib文件夹中。相反,我需要它在war文件中的WEB-INF / classes中,以及用于jettyRun的src / main / resources中。
如何控制依赖关系的结束位置?或者我是以错误的方式解决这个问题?
我也可以通过复制任务来解决这个问题,但这确实是一种依赖关系,因为我不需要更新文件,除非它发生变化。无条件的副本可行,但我宁愿以正确的方式做到这一点。
答案 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
为了允许jettyRun
将webapp
main-project
目录的内容与resources
中other-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 Guide和DSL 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'
}
}