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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值