没有 jar 的 Gradle Wrapper

scp*_*ntm 3 gradle gradlew

我正在设计一个企业范围的构建系统,到目前为止,已经有超过 1000 个使用大约 21 种不同语言的项目。我们为此使用 gradle,但我遇到了问题。我们正在迁移到 gitlab 服务器,并且刚刚花费数周时间构建了系统和挂钩,这些系统和挂钩明确阻止人们将 jar 文件和其他库提交到源存储库。(长话短说,为什么,你并不真正关心)。

现在问题来了

如果文件夹中没有 jar 文件,我们如何使用 gradle 包装器gradle/wrapper?我尝试删除该文件夹,正如 git hooks 所做的那样,并且gradlew如我所料,它给了我们一个未找到类的错误。

是否可以在没有 jar 的情况下使用包装器,或者用户在克隆项目时必须重新生成包装器?如果文件夹或 jar 丢失,是否可以gradlew将文件设置为自动重新生成?gradle/wrapper

小智 5

所以基本上,当你通过设置包装器时

gradle wrapper
Run Code Online (Sandbox Code Playgroud)

你把:

  • 脚本
  • 特性
  • gradle 包装 jar 文件

进入当前项目目录。来自gradle-wrapper.jar您当地的 Gradle 发行版。你可以在源代码中检查这一点

URL jarFileSource = Wrapper.class.getResource("/gradle-wrapper.jar");
if (jarFileSource == null) {
    throw new GradleException("Cannot locate wrapper JAR resource.");
}
GFileUtils.copyURLToFile(jarFileSource, jarFileDestination);
Run Code Online (Sandbox Code Playgroud)

当您运行时,gradle wrapper您可以从该 jar 中调用主类,以便下载并运行 Gradle。因此从技术上讲,您可以修改 SH 和 BASH 脚本,以便在 Java 执行之前从 GitHub 存储库下载包装器文件,显然仅当该文件不存在时。我实际上做到了并且有效,但是我无法确定它有多容易出错。我不知道 GitHub 将来是否不会更改 URL。gradlew.sh我刚刚在该行之前的某个位置添加了以下代码片段CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar

if [ ! -f "gradle/wrapper/gradle-wrapper.jar" ]
then
     curl https://raw.githubusercontent.com/gradle/gradle/master/gradle/wrapper/gradle-wrapper.jar -o $APP_HOME/gradle/wrapper/gradle-wrapper.jar
fi
Run Code Online (Sandbox Code Playgroud)

无论如何,包装文件有 56K,并且被设计得尽可能小,以允许人们将其放入 Git 存储库中。话虽这么说,我相信您不应该担心它,只需将这个特定的 JAR 文件添加到您的钩子白名单中并允许它出现在存储库中即可。