我正在使用以下结构对遗留项目进行Gradle处理:
root
+--- common
| \--- config
+--- module1
\--- module2
在原始项目中,config
只是一个文件夹,其中包含在不同环境的子文件夹中组织的配置文件。它包含顶级文件夹props
和许多子文件夹,如:
config
\--- props
+--- prod
+--- dev
+--- john
\--- mike
可以将项目配置为使用任何子文件夹。配置通过如下所示的方法加载:
Config.class.getClassLoader().getResourceAsStream("props/" + ENV + "/" + name);
其中ENV
定义了环境(它是系统属性),即它可以是prod
,dev
,mike
等,{ {1}}只是要加载的文件的名称。
运行测试时,我需要在类路径中包含name
文件夹。在构建生产工件(JAR和WAR)时,我不想避免这种情况,只手动复制我需要的文件以避免可能的冲突或事故。
所以我决定将props
作为自己的Gradle项目,并将其作为testCompile依赖项添加到需要配置的其他模块中。但是,如果我在Gradle中将config
文件夹添加为资源文件夹,则props
模块的生成JAR文件将展平config
的所有子文件夹(这是预期的行为),因此上面的代码将失败。
我的问题是:有没有办法告诉Gradle将这些文件复制到名为props的子文件夹而不是JAR的根目录?
我知道重构项目并移动文件夹很容易,但我们正处于从遗留构建和部署工具过渡的阶段,并希望尽可能保持原始结构,直到我们完全切换到Gradle 。这是一个迭代过程,不可能在一夜之间发生。所以我需要一个临时解决方案。
答案 0 :(得分:4)
以下是我最终如何做到这一点。这是build.gradle
模块的config
文件:
apply plugin: 'java'
sourceSets {
main {
resources {
srcDir 'props'
}
}
}
// this is to force Gradle to create the JAR used at
// runtime with the correct folder structure
jar.into('props')
idea.module.iml.withXml {
def node = it.asNode()
// this is to force IntelliJ to create the folders
// used at runtime with the correct folder ('package') structure
node.component.content.sourceFolder.@packagePrefix="props"
}
它就像一个魅力,因为config
模块只包含props文件夹中的资源。呼。