使用Gradle将资源和配置文件添加到您的JAR中

119

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

我的项目结构:

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

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

期望的jar包结构:

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

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

8个回答

116

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

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

6
这个方案比被接受的答案简单得多。 - Stewart

87

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


1
对我来说可行,看起来是实现这个目标最简单和“最正确”的方法。 - EM-Creations
1
这个答案提供了一种变通方法而不是解决方案,而Gradle则提供了解决方案。 - Terrible Tadpole
3
@TerribleTadpole 这是正确的解决方案。其他都是权宜之计。 - jannis

73

谢谢各位,我正在将一个现有的项目迁移到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
   }
}

39
重新配置源集更准确。可以像这样做:sourceSets.main.resources { srcDirs = ["src/main/java"]; exclude "**/*.java" },这将排除所有 ".java" 文件。 - Peter Niederwieser
1
感谢@PeterNiederwieser!! 我一直在尝试使用shadow构建我的可执行jar文件,并将log4j.xml文件包含在其中。我也在处理一个较旧的项目,无法轻松更改目录结构。您的建议正是我所需要的!! :D - Piko
@PeterNiederwieser - 我在Java插件文档中注意到,资源已经被定义为排除*.java文件。"仅包含资源,并排除在资源源目录中找到的任何.java文件。" - Joe Bowbeer

31

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

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

这部分 文档提供了所有的细节。


6
你想知道为什么只包括 .../resources/ 目录的内容而不是连同目录内的内容一起包括? - sargas
@sargas,你最好开一个新的问题,这样你可以轻松地包含所有上下文。在评论区很难获得更多信息 :( - geoand

21

我也遇到了同样的问题。我在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/


3
我使用+=运算符将我的文件夹添加到现有的文件夹中:例如,sourceSets.main.resources.srcDirs += [ "src/main/java" ] - TmTron

3

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


1

正如我在这里回答的那样,为了更细致地配置资源目录,也可以使用srcDir

sourceSets {
    main {
        resources {
            srcDir "src/main/resources"

            srcDir "src/main"
            include "configs/**/*.xml"
        }
    }
}

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

0

这是为了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)会显示有用的图标,以指示它们是资源根目录:

A directory added as resources root in Gradle shown in IntelliJ IDEA


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接