使用 gradle 将资源、配置文件添加到您的 jar 中
Posted
技术标签:
【中文标题】使用 gradle 将资源、配置文件添加到您的 jar 中【英文标题】:Add resources and config files to your JAR using Gradle 【发布时间】: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 配置文件
【问题讨论】:
【参考方案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 您可能应该开始一个新问题,您可以轻松地包含所有上下文。在评论部分很难得到很多信息:(以上是关于使用 gradle 将资源、配置文件添加到您的 jar 中的主要内容,如果未能解决你的问题,请参考以下文章
xcode 8.0“将Push Notif(..)添加到您的App ID”警告,同时已添加
将“Inter-App Audio”权利添加到您的权利文件中
查找预编译头文件时意外结束。您是不是忘记将#include stdafx.h 添加到您的源代码中?
css Bootstrap Equal Column Heights - 将CSS添加到您的文件中,并将“row-eq-height”类添加到您想要的列周围的行中