我正在设计一个企业级的构建系统,到目前为止已有大约21种不同语言的项目。我们正在使用gradle,我有一个问题。我们正在迁移到gitlab服务器,我们刚刚花了数周时间构建系统和挂钩,明确阻止人们将jar文件和其他库提交到源代码库。 (很长的故事,为什么,你真的不在乎)。
现在问题
我们如何在gradle/wrapper
文件夹中使用没有jar文件的gradle包装器?我尝试删除文件夹,就像git钩子一样,gradlew
给我们一个未找到类的错误,正如我所料。
是否可以在没有jar的情况下使用包装器,或者用户在克隆项目时是否必须重新生成包装器?如果gradlew
文件夹或jar丢失,gradle/wrapper
文件是否可以设置为自动重新生成?
答案 0 :(得分:1)
所以基本上,当您通过
设置包装时gradle wrapper
你放了:
进入当前项目目录。 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调用主类以下载并运行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
无论如何,包装器文件有56K,它的设计尽可能小,以便人们将它放入Git存储库。话虽这么说,我相信你不应该担心它,只需将这个特定的JAR文件添加到你的钩子白名单并允许它存储在存储库中。
答案 1 :(得分:0)
gradlew
脚本取决于gradle-wrapper.jar
,因为它只是从JAR调用 GradleWrapperMain 。因此,如果没有JAR,则无法使用包装器脚本。但是,你可以" bootstrap"使用this script的包装器。