【问题标题】:Gradle change resource files target location in JARGradle 更改 JAR 中的资源文件目标位置
【发布时间】:2014-03-09 19:15:22
【问题描述】:

我正在 Gradle-fying 一个具有以下结构的遗留项目:

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

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

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

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

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

其中ENV定义环境(它是系统属性),即可以是proddevmike等,而name只是要加载的文件的名称.

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

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

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

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

【问题讨论】:

    标签: java jar gradle classpath


    【解决方案1】:

    这就是我最终的做法。这是config 模块的build.gradle 文件:

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

    【讨论】:

      猜你喜欢
      • 2016-08-31
      • 2022-01-25
      • 2016-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-03
      • 1970-01-01
      • 2018-12-28
      相关资源
      最近更新 更多