微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

shell 无法识别 Gradle 包装器

如何解决shell 无法识别 Gradle 包装器

我有如下的 shell 脚本 -

enter image description here

由于 gradlew 位于项目根目录,因此它作为 ../gradlew clean 调用,比 backend_test.sh 文件高一级 -

enter image description here

但是 Gitlab ci 作业失败并出现以下错误 -

./test-runners/backend_test.sh: line 21: ../gradlew: No such file or directory

如果我也在根级别移动 backend_test.sh 并更新 shell 文件以将 gradlew 调用./gradlew clean,则没有错误。当 backend_test.sh 不在根级别时,我做错了什么?

更新:

在本地运行 shell,即 ./backend_test.sh 出现以下错误 -

Configure project : 
Evaluating root project 'test-runners' using build file 
'/Users/tarunkumar/dev/git/system-test/test-runners/build.gradle'.
All  projects evaluated.

FAILURE: Build Failed with an exception.

* What went wrong:
Task 'clean' not found in root project 'test-runners'.

为什么在 build.gradle 文件夹中查找 test-runner,即使它与 test-runner 处于同一级别?

解决方法

所有相对路径都相对于当前工作目录进行评估。如果您使用的是 shell,工作目录通常会显示在您的 shell 提示符中。您的工作目录和当前处理的文件的目录之间没有链接。此行为说明了您的所有问题:


由于 gradlew 位于项目根目录下,因此它作为 ../gradlew clean 调用,比 backend_test.sh 文件高一级 -

在 CI 服务器上,通常使用根目录作为工作目录来调用所有进程(我不确定 GitLab CI,但我猜它的行为也是如此)。现在 ../gradlew 将相对于您的根目录进行评估,这将不起作用,因为它在 GitLab CI 用作临时文件夹的任何父目录中搜索 gradlew。您可以通过在本地将 shell 导航到您的项目目录然后调用 test-runners/backend_test.sh 来检查此行为,它应该会导致相同的错误。

如果我也在根级别移动 backend_test.sh 并更新 shell 文件以将 gradlew 调用为 ./gradlew clean,则没有错误。

当然,只要脚本将从您的项目目录中调用,这是 CI 服务器上的默认值,正如我们已经注意到的那样。在本地,您只需导航到您的项目目录并调用 backend_test.sh

在本地运行 shell,即 ./backend_test.sh 出现以下错误

好吧,现在我们又遇到了同样的问题。您的脚本可以找到 ../gradlew 并调用 Gradle,但遗憾的是,Gradle 将评估工作目录以查找相关的 build.gradle 文件。但是现在工作目录位于您的 test-runners 文件夹中,Gradle 将在此文件夹中搜索 build.gradle 文件。如果该文件夹中没有 build.gradle 文件,Gradle 根本不在乎,而是假设有一个空的 build.gradle 文件。现在 Gradle 使用这个(空)项目来运行构建,但是由于(空)项目中没有任务 clean,Gradle 失败了。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?