首页 文章

使用Gradle的Application插件添加类路径条目

提问于
浏览
19

我正在使用Gradle的Application插件为独立的Java应用程序生成安装 . 我有一个配置文件,我需要放在类路径上,但我似乎无法让它在sh / bat文件中正确生成类路径 . 此配置文件需要位于jar外部 .

conf文件位于 /src/dist/conf/ 目录中,因此当我运行 installApp 时,它会将其安装在这样的 $APP_HOME/conf 之类的conf目录下 .

我尝试将此目录添加到claspath,如下所示:

startScripts.classpath.add(files('$APP_HOME/conf'))

但是当我查看sh / bat文件中的类路径时,它会添加一个如下所示的条目:

$APP_HOME/lib/conf

如何告诉gradle删除此条目的 lib 部分?

5 回答

  • 3

    此问题的另一个解决方法(GRADLE-2333)由Alexandr Fadeev提出here .

    这是(有点修改)Alexandr的解决方案,在Gradle-1.6上解决了我的问题:

    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')
      }
    }
    

    它比Josh的解决方案有点丑,但它允许您保留原始问题中提到的确切目录布局(/ src / dist / conf和$ APP_HOME / conf) .

  • 14

    将文件放到类路径上的最简单方法是将其放入 src/main/resources . src/dist 用于将文件添加到分发(即zip文件),而不是添加到Jar /类路径 .

  • 4

    这对你的问题不是一个特别好的答案,但是我发现了一些startScripts任务还没有我们需要的灵活性的实例 .

    通过直接编辑文件内容,我已经解决了几个这样的实例......并没有完全利用Gradle的优秀模型而不是特别推荐,但至少展示了Gradle的灵活性!

    所以你可以像这样破解类路径中的东西:

    tasks.startScripts {
      doLast {
        def scriptFile = file "${outputDir}/${applicationName}"
        scriptFile.text = scriptFile.text.replace('CLASSPATH=$APP_HOME/lib', 'CLASSPATH=$APP_HOME/conf/:$APP_HOME/lib')
      }
    }
    

    在执行此操作时,请注意打破启动脚本的平台独立性 .

  • 4

    在我看来,我远远超出了常规,但作为一种解决方法,我可以让 dist 目录为 src/dist/lib/conf ,它允许 conf 目录放在 lib 目录中,并且gradle为sh生成的类路径/ bat文件是正确的 .

    如果有人有更好的答案,我会接受另一个答案 .

  • 3

    我在下面做了Martin Dow的配方变体:

    我在启动脚本中将'APP_HOME ='替换为'export APP_HOME =' .

    然后我的代码可以执行System.env.get(“APP_HOME”),然后导航到例如conf /文件夹 .

    这是我的Gradle hack:

    tasks.startScripts {
      doLast {
        def scriptFile = file "${outputDir}/${applicationName}"
        scriptFile.text = scriptFile.text.replaceAll('APP_HOME=',  'export APP_HOME=')
      }
    }
    

    应用程序中的Java代码示例:

    String APP_HOME = System.env().get("APP_HOME");
    Properties p = new Properties();
    p.load(new FileInputStream(APP_HOME + "/conf/myapp.properties"))
    

    希望这可以帮助 .

    注意:"export"在Windows中不起作用!

相关问题