我正在使用基于容器的 CI/CD 系统设置 Gradle,该系统具有分离的构建与运行环境。在构建中,项目的磁盘是可写的。在运行时,只有选定的目录是可写的,并且这些目录在构建期间不可用。两者之间有明显的区别。
我遇到的问题是,在构建步骤中运行 gradlew build
有效,但随后在生产环境中运行 gradlew run
(在只读环境中)文件系统)失败。具体来说,在运行时它尝试再次重新编译项目,但失败了(当然,因为文件系统是只读的)。但既然已经编译过了,为什么还要重新编译呢?
我尝试使 build
和 .gradle
目录都可运行时写入。这确实有效,然后 gradlew 将再次重新编译整个系统,写入这些目录并运行。如果我再次将 build
目录设置为只读,它会继续工作。对我来说,这表明 .gradle
的某些部分需要在运行时可写,但到目前为止,我还没有找到除“一切和一切”之外的其他组合,这显然是不可取的。 (进行一次性构建然后摆弄目录挂载作为生产实践是行不通的,因为它不是可重复的构建。)
我对 Gradle 还很陌生,所以我不确定原因是什么。我最好的理论是 gradlew 最初想要重新下载 gradle(即使它可能已经在 .gradle 中?)导致它跳过所有预先存在的生成文件,即使他们在场。这就是为什么一次成功的构建会修复它以供将来的构建使用,即使 build
目录是只读的。
所以我的问题是,一般来说,.gradle
的哪些部分需要运行时可写,以便 Gradle 构建的应用程序能够在只读环境中工作?或者,更一般地说,如何使 Gradle 构建的应用程序在只读环境中工作?
最佳答案
不要使用 Gradle 在生产时运行您的项目。 Gradle 是一个构建工具,application
插件添加的 run
任务仅用于测试目的。如果您不想生成可分发文件,然后在生产时使用它,但如果您想用完项目目录,则至少在构建时使用 installDist
,然后将项目运行为它与生成的启动脚本一起在 build/install/...
中组装。
关于java - gradle 包装器需要哪些文件可写才能运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42636986/