具有conf文件夹的Gradle构建文件,其属性不在jar中但在classpath

时间:2016-07-16 23:26:49

标签: java gradle

请与分享的文件夹共享build.gradle脚本示例" conf":

  1. 包含所有包含文件的文件夹在" gradle distZip&#34 ;;
  2. 期间打包到zip文件中
  3. 此文件夹中的文件位于启动文件文件(bin文件夹中)的类路径中(例如,ClassLoader可访问);
  4. 运行gradle run,gradle build等时,这些文件也在类路径中。
  5. 加法#1:

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

    加法#2:

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

    1. Req#1:ok(目录config包含资源文件),但此资源也位于lib文件夹中。
    2. Req#2:ok(目录config在启动脚本的类路径中),但classpath另外包含无效的文件夹%APP_HOME%\lib\config
    3. Req#3:ok
    4. 此外,我测试了3种加载文件内容的方法(如上所述here),方法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目录中的文件加载前面提到的任何方法。

1 个答案:

答案 0 :(得分:2)

如此处Gradle distZip config files所述,您只需将文件夹dist/config添加到src文件夹即可自动包含在distZip任务中。

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

由于startScripts的限制,要求#2稍微困难一些。但是,这个问题的答案提出了一种解决方法:Adding classpath entries 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任务期间,gradle使用的运行脚本和命令行中都会显示正确的类路径条目。

编辑:在您的评论中,您暗示您还希望在构建脚本的类路径中提供此选项。如果是这种情况,则需要添加如下的buildscript依赖项:

buildscript {
  dependencies {
    classpath files('src/dist/config')
  }
}

编辑#2:在另一条评论中,您提到添加运行时依赖项会导致在启动脚本类路径中生成额外的无效条目。您可以通过添加任何JavaExec任务的类路径来解决此问题,而不是使用依赖项。所以用

替换dependencies { runtime { ... } }
tasks.withType(JavaExec) {
  classpath += files('src/dist/config')
}