【问题标题】:Add resources and config files to your JAR using Gradle使用 gradle 将资源、配置文件添加到您的 jar 中
【发布时间】:2014-09-03 15:39:21
【问题描述】:

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

我的项目结构:

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

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

预期的 jar 结构:

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

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

【问题讨论】:

    标签: gradle build.gradle


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

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

        谢谢大家,我正在将一个现有项目迁移到 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 文件。”
        【解决方案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/java 移动到src/main/resources

        【讨论】:

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

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

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

        This部分文档包含所有细节

        【讨论】:

        • 你知道为什么只包含.../resources/ 的内容而不是resources 目录 的内容吗?
        • @sargas 您可能应该开始一个新问题,您可以轻松地包含所有上下文。在评论部分很难得到很多信息:(
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-26
        • 2011-10-26
        • 1970-01-01
        • 2013-05-14
        • 2010-11-16
        • 2019-05-22
        • 1970-01-01
        相关资源
        最近更新 更多