Gradle更改资源文件在JAR中的目标位置

时间:2014-02-11 19:37:35

标签: java jar gradle classpath

我正在使用以下结构对遗留项目进行Gradle处理:

root
+--- common
|    \--- config
+--- module1
\--- module2

在原始项目中,config只是一个文件夹,其中包含在不同环境的子文件夹中组织的配置文件。它包含顶级文件夹props和许多子文件夹,如:

config
\--- props
     +--- prod
     +--- dev
     +--- john
     \--- mike

可以将项目配置为使用任何子文件夹。配置通过如下所示的方法加载:

Config.class.getClassLoader().getResourceAsStream("props/" + ENV + "/" + name);

其中ENV定义了环境(它是系统属性),即它可以是proddevmike等,{ {1}}只是要加载的文件的名称。

运行测试时,我需要在类路径中包含name文件夹。在构建生产工件(JAR和WAR)时,我不想避免这种情况,只手动复制我需要的文件以避免可能的冲突或事故。

所以我决定将props作为自己的Gradle项目,并将其作为testCompile依赖项添加到需要配置的其他模块中。但是,如果我在Gradle中将config文件夹添加为资源文件夹,则props模块的生成JAR文件将展平config的所有子文件夹(这是预期的行为),因此上面的代码将失败。

我的问题是:有没有办法告诉Gradle将这些文件复制到名为props的子文件夹而不是JAR的根目录?

我知道重构项目并移动文件夹很容易,但我们正处于从遗留构建和部署工具过渡的阶段,并希望尽可能保持原始结构,直到我们完全切换到Gradle 。这是一个迭代过程,不可能在一夜之间发生。所以我需要一个临时解决方案。

1 个答案:

答案 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文件夹中的资源。呼。