【问题标题】:Add resources and config files to your JAR using Gradle使用 Gradle 将资源和配置文件添加到 JAR
【发布时间】:2014-07-13 15:39:45
【问题描述】:

如何使用 gradle 将配置文件或任何其他资源添加到我的 jar 中?

我的项目结构:

src/main/java/com/perseus/.. --- Java 包(源文件)

src/main/java/config/*.xml --- Spring 配置文件

预期的 jar 结构:

com/perseus/.. --- Java 包(类文件)

config/*.xml --- Spring 配置文件

【问题讨论】:

    标签: gradle jar build.gradle embedded-resource


    【解决方案1】:

    我在搜索如何为资源添加额外目录时遇到了这篇文章。我找到了一个可能对某人有用的解决方案。这是我的最终配置:

    sourceSets {
        main {
            resources {
                srcDirs "src/main/resources", "src/main/configs"
            }
        }
    }
    

    【讨论】:

    • 这是一个比公认答案简单得多的解决方案
    【解决方案2】:

    将配置文件从src/main/java 移动到src/main/resources

    【讨论】:

    • 对我有用,看起来是实现这一目标的最简单和“最正确”的方法。
    • 这个答案建议的是一种变通方法而不是解决方案,Gradle 提供了一个解决方案。
    • @TerribleTadpole 这是正确的解决方案。所有其他都是解决方法。
    【解决方案3】:

    谢谢大家,我正在将一个现有项目迁移到 Gradle,并且不喜欢改变项目结构的想法。

    我已经弄清楚了,认为这些信息对初学者可能有用。

    这是我的“build.gradle”中的一个示例任务:

    version = '1.0.0'
    
    jar {
       baseName = 'analytics'
       from('src/main/java') {
          include 'config/**/*.xml'
       }
    
       manifest {
           attributes 'Implementation-Title': 'Analytics Library', 'Implementation-Version': version
       }
    }
    

    【讨论】:

    • 重新配置源集更准确。类似sourceSets.main.resources { srcDirs = ["src/main/java"]; exclude "**/*.java" }
    • 谢谢@PeterNiederwieser!!一直试图让我的 log4j.xml 文件包含在我使用 shadow 构建的可执行 jar 中。我也在处理一个较旧的项目,无法轻易更改目录结构。你的建议正是我所需要的!! :D
    • @PeterNiederwieser - 我在 Java 插件文档中注意到资源已被定义为排除 *.java。 “仅包含资源,不包括在资源源目录中找到的任何 .java 文件。”
    【解决方案4】:

    默认情况下,您添加到 src/main/resources 的任何文件都将包含在 jar 中。

    如果您出于某种原因需要更改该行为,可以通过配置 sourceSets 来实现。

    This部分文档包含所有细节

    【讨论】:

    • 你知道为什么只包含.../resources/ 的内容而不是resources 目录 的内容吗?
    • @sargas 您可能应该开始一个新问题,您可以轻松地包含所有上下文。在评论部分很难得到很多信息:(
    【解决方案5】:

    我遇到了同样的问题。我在 Java 包中有一个 PNG 文件,它没有与源一起导出到最终的 JAR 中,这导致应用程序在启动时崩溃(找不到文件)。

    以上答案都没有解决我的问题,但我在 Gradle 论坛上找到了解决方案。我在build.gradle 文件中添加了以下内容:

    sourceSets.main.resources.srcDirs = [ "src/" ]
    sourceSets.main.resources.includes = [ "**/*.png" ]
    

    它告诉 Gradle 在 src 文件夹中查找资源,并要求它仅包含 PNG 文件。

    编辑:请注意,如果您使用的是 Eclipse,这会破坏您的运行配置,并且在尝试运行您的程序时会收到 main class not found 错误。为了解决这个问题,我找到的唯一解决方案是将图像移动到另一个目录,例如res/,并将其设置为srcDirs,而不是src/

    【讨论】:

    • 我使用+= 运算符将我的目录添加到现有目录中:例如sourceSets.main.resources.srcDirs += [ "src/main/java" ]
    【解决方案6】:

    请注意,src/main/resources 下的路径必须与希望访问资源的 .class 文件的包路径匹配。看我的回答here

    【讨论】:

      【解决方案7】:

      正如我已回答here,为了在配置资源目录时获得更多粒度,还可以使用srcDir

      sourceSets {
          main {
              resources {
                  srcDir "src/main/resources"
      
                  srcDir "src/main"
                  include "configs/**/*.xml"
              }
          }
      }
      

      因此,如果您有 src/main/java/config/*.xml jar 结构,则按要求将有 configs/*.xml

      【讨论】:

        【解决方案8】:

        这是为Kotlin DSL (build.gradle.kts) 准备的。

        将以下代码添加到您的子项目或应用 build.gradle.kts 文件中:

        sourceSets {
            main {
                resources {
                    srcDirs("src/main/configs", "src/main/misc")
                }
            }
            // OR another notation
            // main.get().resources.srcDirs("src/main/configs", "src/main/misc")
        }
        

        正如其他答案所述,src/main/resources/ 中的文件会自动添加到 JAR 中。上面代码中的 srcDirs() 函数将其给定路径添加到现有路径,因此这些目录中的文件也将包含在 JAR 中。您可以添加任意数量的条目。

        请注意,在添加上述代码并将您的更改与 IDE 同步后,一些 IDE(如 IntelliJ IDEA 和 Android Studio)会为这些目录显示一个有用的图标,以表明它们是资源根目录:

        【讨论】:

          猜你喜欢
          • 2014-09-03
          • 1970-01-01
          • 2011-04-26
          • 2013-05-14
          • 2010-11-16
          • 2011-10-26
          • 1970-01-01
          • 2019-05-22
          • 2012-09-06
          相关资源
          最近更新 更多