带有conf文件夹的Gradle构建文件,其属性不在jar中,而是在类路径中

los*_*jos 5 java gradle

您能否分享一个带有配置文件夹“conf”的 build.gradle 脚本示例:

  1. 这个文件夹包括所有包含的文件,在“gradle distZip”过程中被打包成 zip 文件;
  2. 此文件夹中的文件位于 startscripts 文件(在 bin 文件夹中)中的类路径(例如,ClassLoader 可访问);
  3. 当运行 gradle run、gradle build 等时,这些文件也在类路径上。

添加#1:

我已经完成了@wakjah 指出的答案中提到的操作,文件被复制到一个 zip 文件并且在 期间没有放入 jar gradle distZip,这涵盖了我的要求 #1。但是此文件夹不在文件夹的启动脚本中的类路径上bin不包括要求 #2 )。运行时文件不在类路径上gradle clean run不包括要求 #3 )。

添加#2:

@wakjah的帮助下,我从头开始了示例项目,现在我拥有:

  1. 要求 #1:好的(目录config包含资源文件),但此资源也在lib文件夹中。
  2. 要求 #2:好的(目录config在启动脚本中的类路径上),但类路径还包含无效文件夹%APP_HOME%\lib\config
  3. 要求 #3:好的

此外,我测试的加载文件内容的方法3(如所提到的在这里),方法Thread.currentThread().getContextClassLoader().getResource(name)成功。

在此处添加了我的示例项目 zip 文件:http : //rgho.st/8r2dJjSz7

添加#3

当我在 gradle 脚本中评论/删除时:

dependencies { runtime files('src/dist/config') }

lib/config文件夹不在 CLASSPATH 上(没关系),并且资源文件不会复制到lib文件夹中(没关系)。但是资源文件无法从 Idea 加载起始类 main() 方法并gradle clean run从命令提示符运行。在gradle clean distZip部署(解包)应用程序之后,资源被加载。

添加#4

更换后

dependencies { runtime files('src/dist/config') }

tasks.withType(JavaExec) { classpath += files('src/dist/config') } 一切都很好,谢谢,@wakjah!还有一个问题,在初始要求中没有提到:当我在 Idea 中启动这个项目时(不是执行 gradle run,而是直接从 Idea 在类中启动 main()),目录中的config文件无法使用前面提到的任何方法加载.

wak*_*jah 2

正如此处Gradle distZip 配置文件所述,您只需将文件夹添加dist/config到您的src文件夹中,它将自动包含在distZip任务中。

至于将其添加到运行时类路径中,只需将该文件夹添加为依赖项即可(见下文)。

由于 .2 的限制,要求 2 有点困难startScripts。但是,这个问题的答案提出了一种解决方法:Adding classpath Entry using Gradle's Application plugin

以下代码收集了以上所有内容:

// put config files in src/dist/config

dependencies {
  runtime files('src/dist/config')
}

startScripts {
  classpath += files('src/dist/XxxAPlaceHolderForAConfigxxX')
  doLast {
    def windowsScriptFile = file getWindowsScript()
    def unixScriptFile    = file getUnixScript()
    windowsScriptFile.text = windowsScriptFile.text.replace('%APP_HOME%\\lib\\XxxAPlaceHolderForAConfigxxX', '%APP_HOME%\\config')
    unixScriptFile.text  = unixScriptFile.text.replace('$APP_HOME/lib/XxxAPlaceHolderForAConfigxxX', '$APP_HOME/config')
  }
}
Run Code Online (Sandbox Code Playgroud)

我已经对此进行了测试,它似乎有效。正确的类路径条目会出现在任务期间运行脚本和 gradle 使用的命令行中run

编辑:在您的评论中,您暗示您还希望它在构建脚本的类路径中可用。如果是这种情况,您需要添加一个构建脚本依赖项,如下所示:

buildscript {
  dependencies {
    classpath files('src/dist/config')
  }
}
Run Code Online (Sandbox Code Playgroud)

编辑#2:在另一条评论中,您提到添加运行时依赖项会产生意想不到的结果,即在启动脚本类路径中生成额外的无效条目。您可以通过添加到任何JavaExec任务的类路径而不是使用依赖项来解决此问题。因此将dependencies { runtime { ... } }块替换为

tasks.withType(JavaExec) {
  classpath += files('src/dist/config')
}
Run Code Online (Sandbox Code Playgroud)