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

标签 java gradle

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

my-project.zip
|
+- my-project
   |
   +- bin (containing start scripts)
   +- lib
   +- xyz (folders from src/dist)

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

这可能吗?

我试过设置 tasks.startScripts.outputDir但没有成功(脚本已从分发包中完全删除)。

更新

除了 lu.koerfer 的回答之外,我还必须修改启动脚本以考虑更改后的 APP_HOME:
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')
    }
}

最佳答案

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

distributions.main {
    contents {
        from startScripts
    }
}

这段代码只是简单地添加了 startScripts 的输出任务到main分发内容。它们将放置在此发行版的根文件夹中,因为您没有指定子项 CopySpecinto方法。

我假设你想要你的启动脚本 只有在根文件夹中,但不在 bin 中文件夹。由于您只能排除 Copy 的文件任务基于它们的源路径而不是它们的目标路径,您需要在复制它们时通过 eachFile 排除它们。方法(因为他们的目的地是已知的):
distZip {
    eachFile { file ->
        if (file.path.contains('bin')) {
            file.exclude()
        }
    }
}

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

关于java - 在 gradle 构建中自定义启动脚本的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46327736/

相关文章:

java - Guice 可以根据一个参数自动创建不同类的实例吗?

java - Java 是否具有与 Objective-C 中的 @synthesize 等效的功能?

java - 无法同步 Gradle 项目 'Sunshine-Version-2'

gradle - 如何使用Kotlin,Gradle和Web框架设置Spring Loaded?

对象上的Java任意比较器

java - 使用 tika 检索错误的 mime 类型 (application/x-tika-ooxml)

java - 实现新闻提要的最佳方式 - 类似于天空新闻应用程序

android - 安装了版本24.0.0的构建工具,但gradle没看到它

Java 8 上的 Spring Boot 应用程序的 Gradle 包装器失败,Gradle 3 : can't find cacerts

android - gradle导入会突然失败吗?