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" 包装器
我正在设计一个企业范围的构建系统,到目前为止,已经有超过 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.