在gradle构建中自定义启动脚本的位置

时间:2017-09-20 16:52:43

标签: java gradle

我是新手,试图打包我的一个小项目。构建我的分发包时,结构如下:

bin

我想要实现的是在项目根文件夹中使用启动脚本而不是my-project.zip | +- my-project | +- lib +- xyz (folders from src/dist) +- my-project.bat +- my-project.sh 子文件夹(我知道这是某种约定,但我也想从应用程序中启动我的应用程序文件夹):

tasks.startScripts.outputDir

这可能吗?

我已尝试设置startScripts { startScripts.applicationName = artefactsBaseName doLast { def windowsScriptFile = file getWindowsScript() def unixScriptFile = file getUnixScript() windowsScriptFile.text = windowsScriptFile.text.replace('set APP_HOME=%DIRNAME%..', 'set APP_HOME=%DIRNAME%') unixScriptFile.text = unixScriptFile.text.replace('cd "`dirname \"$PRG\"`/.." >/dev/null', 'cd "`dirname \"$PRG\"`" >/dev/null') } } ,但没有成功(脚本已从分发包中完全删除)。

更新

除了lu.koerfer的回答,我还必须修改启动脚本以考虑更改后的APP_HOME:

Result Set

1 个答案:

答案 0 :(得分:2)

您不想关心创建启动脚本(startScripts任务),而是关于创建zip文件(distZip任务)来控制文件将被放置。为此,您可以直接使用Gradle Distribution插件中的distZip任务或DistributionContainer,该插件会自动应用于Gradle应用程序插件。 DistributionContainer允许您在Gradle项目中管理多个发行版的创建,而应用程序插件默认使用main发行版。

distributions.main {
    contents {
        from startScripts
    }
}

这段代码只是将startScripts任务的输出添加到main分发内容中。它们将被放置在此发行版的根文件夹中,因为您未使用CopySpec方法指定子into

我假设您希望根文件夹中的启动脚本,但也不希望在bin文件夹中。由于您只能根据源路径而不是目标路径排除Copy任务的文件,因此您需要在复制时通过eachFile方法将其排除(因为然后他们的目的地已知):

distZip {
    eachFile { file ->
        if (file.path.contains('bin')) {
            file.exclude()
        }
    }
}

当然,这段代码将从zip文件中删除整个bin目录,因此您可能需要在闭包中重新描述其他用例的条件。