如何设置gradle distZip任务将资源正确放入子目录和类路径?

时间:2016-07-01 17:12:29

标签: java gradle build classpath build.gradle

我有这些build.gradle文件:

dependencies {
  runtime files('src/main/resources')
  runtime files('src/main/resources/cfg')
  runtime files('src/main/resources/sql')
}

jar {
  exclude 'cfg/*'
  exclude 'cfg/'
  exclude 'sql/*'
  exclude 'sql/'
}

这一个

dependencies {
  runtime files('src/main/resources')
  runtime files('src/main/resources/cfg')
  runtime files('src/main/resources/fxml')
  runtime files('src/main/resources/icons')
}

jar {
  exclude 'cfg/*'
  exclude 'cfg/'
  exclude 'icons/*'
  exclude 'icons/'
  exclude 'fxml/*'
  exclude 'fxml/'
}

startScripts {
  doLast {
    def winScriptFile = file getWindowsScript()
    def winFileText = winScriptFile.text
    winFileText = winFileText.replaceAll 'set CLASSPATH=.*', 'set CLASSPATH=%APP_HOME%\\\\lib\\\\\\*;%APP_HOME%\\\\lib\\\\cfg;%APP_HOME%\\\\lib\\\\fxml;%APP_HOME%\\\\lib\\\\icons;%APP_HOME%\\\\lib\\\\sql'
  }
}

我可以从projectName.jar文件中排除资源目录及其文件,但是我无法从dist目录/ distTar任务创建的/ lib目录中排除子目录中的文件。

我希望在zip / tar

中使用此布局
projectName/
|
|-lib/
| |
| |-cfg/
| | |-*.*
| |     
| |-fxml/
| | |-*.fxml
| |
| |-icons/
| | |-*.ico
| |
| |-sql/
| | |-*.sql
| |
| |-*.jar
|
|-bin/
  |
  |-projectName.bat

子目录中的所有资源都不包含在lib目录中,并且子目录在CLASSPATH中的projectName.bat变量中设置,以便应用程序能够加载所有资源

2 个答案:

答案 0 :(得分:2)

您可以添加未包含在项目的JAR文件中的新源集:

   $childForm = '';
   <?php
        $array = array(1,2);
        foreach ($array as $arr) {
            $childForm .= '<form action="" id="'.$arr.'" method="POST">
                    <input type="text" placeholder="hello"/>
                 </form>';
        }
   ?>

<form action="" method="POST">
    <?php echo $childForm; ?>
</form>

此源集包含实际分发所需的依赖项。 sourceSets { dist { resources { srcDirs=['src/main/dist'] } } } 下的文件夹结构需要重建src/main/dist artificat的所需结构,并自动成为ZIP / JAR的一部分:

distZip

要在生成的启动脚本中将资源添加到应用程序的类路径,您可以执行以下操作:

src/main/dist
  └ lib
      ├ cfg
      │   └ …
      ├ sql
      ⁞   └ …

这会将startScripts.classpath.add(files('\"')).add(files('cfg')).add(files('sql')) %APP_HOME%\lib\.%APP_HOME%\lib\cfg添加到启动脚本的类路径中。

答案 1 :(得分:1)

我能够弄清楚,我必须提供这样的资源,将子目录放在lib目录中

dependencies {
  runtime files('src/main/resources')
}

这个改变:

-    winFileText = winFileText.replaceAll 'set CLASSPATH=.*', 'set CLASSPATH=%APP_HOME%\\\\lib\\\\\\*;%APP_HOME%\\\\lib\\\\cfg;%APP_HOME%\\\\lib\\\\fxml;%APP_HOME%\\\\lib\\\\icons;%APP_HOME%\\\\lib\\\\sql'
+    winFileText = winFileText.replaceAll 'set CLASSPATH=.*', 'set CLASSPATH=%APP_HOME%\\\\lib\\\\\\*;%APP_HOME%\\\\lib;%APP_HOME%\\\\lib\\\\cfg;APP_HOME%\\\\lib\\\\fxml;APP_HOME%\\\\lib\\\\icons;APP_HOME%\\\\lib\\\\sql'

缺少这个:%APP_HOME%\\\\lib; 这是必需的,因为fxml资源在源代码中被引用如下:

getClass().getResource("/fxml/somelayout.fxml")

它在CLASSPATH目录中的lib/上查找资源。这是缺失的。