Gradle 没有罐子的包装器

Gradle Wrapper without the jar

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

现在的问题

我们如何在 gradle/wrapper 文件夹中没有 jar 文件的情况下使用 gradle 包装器?我尝试删除文件夹,就像 git 挂钩所做的那样,gradlew 给我们一个 class not found 错误,正如我所料。

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

所以基本上,当您通过

设置 wrapper
gradle wrapper

你输入:

  • 脚本
  • 属性
  • gradle 包装器 jar 文件

进入当前项目目录。 gradle-wrapper.jar 来自您当地的 Gradle 发行版。 You can check this in the source code

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

当您 运行 gradle wrapper 时,您从该 jar 调用主要 class 以便下载和 运行 Gradle。所以从技术上讲,您可以修改 SH 和 BASH 脚本,以便在 Java 执行之前从 GitHub 存储库下载包装文件,显然只有在文件不存在的情况下。我确实做到了并且它起作用了,但是我不确定它有多容易出错。我不知道 GitHub 将来是否会改变 URL。我刚刚在 CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 行之前的 gradlew.sh 某处添加了以下代码段。

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

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

gradlew 脚本依赖于 gradle-wrapper.jar,因为它只是从 JAR 调用 GradleWrapperMain。所以你不能在没有 JAR 的情况下使用包装器脚本。但是,您可以使用 this script.

"bootstrap" 包装器