Gradle完全自定义启动脚本的变通实现

项目使用Gradle做打包工具,使用了Application插件,但其自动生成的启动脚本,不能满足项目的需要,需要自定义启动脚本。我的上一篇文章是通过文件复制、重命名,然后在打包的时候,放到包中。有兴趣的同学可以查看http://buddie.iteye.com/blog/2358311

但上次的实现方式有两个问题无法解决:

1、权限问题

尽量生成脚本时,通过程序为脚本文件添加了执行文件,但脚本被打到包中,再解压之后,权限就变化了(现在想应该也可以解决,可以把生成的脚本也直接放到target/scripts目录下)

2、文件格式问题

开发环境是Windows,文件的是DOS格式,而不是UNIX格式,生成的脚本到Linux服务器上,需要通过:set ff=unix来较正,这点很不人性化

现在花了些时间研究了下,看一下Gradle中CreateStartScripts接口相关的源码,找到了解决方案。

原理简单粗爆:依然通过模板来生成脚本,只不过不是使用Copy,而是手动读取模板文件的内容,加上换行符“\n“,替换变量,然后把内容写入到target/scripts目录下,并增加权限。

这样做,第一解决了DOS格式与UNIX文件格式的问题,换行符”\r\n“换成了"\n"。其实解决了执行权限问题,因为application自动生成的脚本就放在这个目录下,而打包后,权限是保留的。那我也脚本放到这个目录下。实验结果证明了我的做法。

代码如下:build.gradle

import org.apache.tools.ant.taskdefs.Chmod
startScripts << {
    File template = new File("src/script/launch.model")
    List<String> lines = template.readLines("UTF-8")
    java.lang.StringBuffer buffer = new StringBuffer()
    for (String line : lines) {
        buffer.append(line).append("\n")
    }
    String shellContent = buffer.toString()
    shellContent = shellContent.replaceAll("@gradleProjName@", applicationName)
    shellContent = shellContent.replaceAll("@gradleVersion@", pk_version)
    TextUtil.convertLineSeparators(shellContent, "\n")
    File outFile = new File(getProject().getBuildDir().getPath() + "/scripts/launch.sh")
    Writer writer = new FileWriter(outFile)
    writer.write(new String(shellContent.getBytes("UTF-8")))
    writer.flush()
    writer.close()
    Chmod chmod = new Chmod()
    chmod.setFile(outFile)
    chmod.setPerm("ugo+rx")
    chmod.setProject(AntUtil.createProject())
    chmod.execute()
}

猜你喜欢

转载自buddie.iteye.com/blog/2364528