无法找到或加载主类org.gradle.wrapper.GradleWrapperMain。

288

我通过删除本地目录,例如~/.gradle~/.m2~./android~/workspace/project/.gradle并在Android Studio中选择文件 -> 使缓存无效 / 重新启动...来清理整个项目。 现在执行命令./gradlew会引发以下输出:

usr$ ./gradlew tasks
Error: Could not find or load main class org.gradle.wrapper.GradleWrapperMain

不用说,我删除了太多,问题是如何再次修复?你有什么想法来解决这个问题吗?


11
假设您没有设置源代码控制,您应该能够再次运行gradle wrapper来重新生成缺失的代码。 - cjstehno
你的电脑上安装了Gradle吗?你可以尝试调用常规的Gradle而不是gradlew,还应该恢复Gradle包装器。 - RaGe
有趣的是,当我用印地语更改项目文件夹名称时,遇到了这个错误。 - Ashish
尝试使用本地Gradle路径而不是项目本身的路径。 - 袁文涛
27个回答

305
除了 @RaGe 的回答之外,可能还有我遇到的情况,即我有一个全局的 git 忽略文件,忽略了 .jar 文件,因此 gradle wrapper jar 永远不会被提交。因此,在尝试 /var/lib/jenkins/my_project/gradlew build 后,在 Jenkins 服务器上出现了那个错误。我不得不明确地强制添加该 jar,然后进行提交:
git add -f gradle/wrapper/gradle-wrapper.jar

1
真是救命稻草:谢谢!我已经点赞了,所以显然我已经被这个问题困扰多次了。 - Michael Easter
1
尽管这个答案还没有被采纳,但它对我很有用。我没有意识到即使我可以运行 ./gradlew,也并不意味着必要的 /gradle/wrapper/gradle-wrapper.jar 存在(正如答案所建议的那样,它已被 Git 忽略)。将其添加回去解决了问题。 - Ryan W

296

您的gradle包装程序丢失、损坏或被破坏。

--
什么是gradle wrapper:

gradlew 是 gradle 包装程序可执行文件 - 在 Windows 上是批处理脚本,在其他地方是 shell 脚本。当调用包装程序脚本时,会下载定义的 gradle 版本并执行它。通过将包装程序与您的项目一起分发,任何人都可以在不需要事先安装 Gradle 的情况下使用它。更好的是,构建的用户保证使用构建设计要使用的 Gradle 版本。

--
恢复 gradle wrapper:

以前您需要在 build.gradle 中添加一个 wrapper 任务来恢复 gradle 包装程序及其所有依赖项。例如在 build.gradle 中:

    task wrapper(type: Wrapper) {
        gradleVersion = '4.1'
    }

或在 build.gradle.kts 文件中:

    tasks.register<Wrapper>("wrapper") {
        gradleVersion = "4.1"
    }

较新版本的Gradle不需要这样做。现在它是一个内置任务。只需运行:

gradle wrapper

您还可以提供其他标志以指定版本等

gradle wrapper --gradle-version 6.2 --distribution-type all

当你运行此任务时,gradle包装脚本和所需的jar文件将被添加到您的源文件夹中。属性存储在gradle/wrapper/gradle-wrapper.properties中。 (您可能需要在本地安装gradle才能运行此操作。例如,在mac上使用brew install gradle命令安装。有关更详细的说明,请参见此处) -- 首先,为什么它会缺失呢? OP似乎删除了gradle包装程序所依赖的某些内容。 但常见的原因是.gitignore条目防止包装器jar被检入git。请注意,有效的.gitignore可以在源文件夹中,也可以在您的用户主文件夹或git全局配置中的全局文件夹中。通常在.gitignore中会有一个*.jar条目。 您可以在.gitignore中添加gradlew的jar文件的例外。
*.jar
!gradle/wrapper/gradle-wrapper.jar

或者强制将包装器jar添加到git中

git add -f gradle/wrapper/gradle-wrapper.jar

--
参考文献: Gradle Wrapper

13
这个错误的另一个可能原因是 gradle/wrapper/gradle-wrapper.jar 文件不可执行,比如你从Windows系统复制过来... - centic
我曾经遇到过这种情况,最终通过在没有参数的情况下执行gradlew.bat解决了问题。不知道为什么,但值得一试。 - Alwyn Schoeman
救了我的一天!我在“*.jar”中忽略了gradle-wrapper.jar,所以在管道上构建失败并出现了同样的问题。 - Fan Applelin
3
我非常希望得到一份包含正确解释的答案,而不仅仅是几行可复制粘贴的代码来解决问题。谢谢。 - Mick Byrne
你做得很好,RaGe。那正是我情况中正在发生的事情。 - Deepak Bandela

76

8
如果这个命令不能正常运行,在AS的右侧有一个Gradle面板。点击Gradle->ProjectName->ProjectName->Tasks->build setup->wrapper - Jemshit Iskenderov
适用于我。 - negrotico19
是的,我在IntelliJ IDE上的springBoot项目中遇到了同样的问题,这个建议解决了这个问题。谢谢@niklasingvar - Ermias K
它对我有用,我可以从Eclipse IDE执行任务包装器。从控制台无法工作。谢谢! - esterrrsinH

47
在我的情况下,这是一个全局的.gitignore如@HankCa的答案所解释的那样
不要强制添加jar文件,你需要记住在每个Gradle项目中都要这样做,我在我的全局.gitignore中添加了一个覆盖项,重新包含包装器jar文件:
*.jar
!gradle/wrapper/gradle-wrapper.jar

这对我很有用,因为我有许多使用Gradle的项目;现在Git会提醒我包含wrapper jar。

只要没有忽略gradle-wrapper.jar上面的任何目录(例如gradlewrapper),此覆盖就会生效 -- 出于性能原因,Git不会进入被忽略的目录


是的,这个问题在我的情况下也是一样的。 - silentsudo

30
在我的情况下,在复制`gradle`文件夹时,我没有复制`wrapper`子文件夹,因此出现了相同的错误: 无法找到或加载主类org.gradle.wrapper.GradleWrapperMain 如果您从其他位置复制包装器,请确保您拥有正确的文件夹结构。
├── build.gradle
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
└── settings.gradle

为什么要复制包装器?只需执行“gradle wrapper”即可获得完全相同的结果 ;) - xeruf
@Xerus,在一些企业环境中,存在网络限制,您无法自由下载软件包。在这种情况下,您必须进行复制/移动操作。 - yantaq

12

我只是从以前的一个项目中复制了gradle-wrapper.jar,从路径/android/gradle/wrapper中粘贴到了我的应用程序中相同的路径/android/gradle/wrapper,结果完美运行。

放松一下 :)


这就是解决方法,但我遇到了一个小问题,我在GitHub操作中使用了fastlane,并且这些文件已经被添加到了同一项目的.gitignore文件中。所以只需从gitignore文件中移除它们并推送即可。 - Remoo

11

你的项目中可能缺失了目录 gradle/wrapper 下的 gradle-wrapper.jar 文件。

你可以通过在 build.gradle 文件中添加以下脚本生成该文件,

task wrapper(type: Wrapper) {
   gradleVersion = '2.0' // version required
}

并运行任务:

gradle wrapper

使用gradle 2.4(或更高版本),您可以设置一个Wrapper而无需添加专用任务:
gradle wrapper --gradle-version 2.3

或者

gradle wrapper --gradle-distribution-url https://myEnterpriseRepository:7070/gradle/distributions/gradle-2.3-bin.zip

所有细节可以在此链接中找到。

在 Windows 10 上执行 "gradle wrapper --gradle-distribution-url https://myEnterpriseRepository:7070/gradle/distributions/gradle-2.3-bin.zip" 命令时出现了许多错误。 - Love and peace - Joe Codeswell
是的,问题在于缺少 gradle/wrapper 目录的内容。可以通过运行您所述的 gradle wrapper 来解决这个问题。 - Yuri
1
如果这个命令不起作用,在AS中右侧有Gradle面板。点击Gradle->项目名称->项目名称->任务->构建设置->包装器 - Jemshit Iskenderov

11

当我遇到这个问题时,我按照上面的答案进行了操作。如果你也遇到了这个问题,请确保强制推送JAR和属性文件。在这两个步骤之后,我不再遇到这个问题了。

git add -f gradle/wrapper/gradle-wrapper.jar
git add -f gradle/wrapper/gradle-wrapper.properties

8
在我的情况下(使用Windows 10),gradlew.bat 中包含以下代码行:
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%

APP_HOME变量实际上是gradle项目的根文件夹,如果此处出现问题,则会得到以下错误消息:
错误:找不到或加载主类org.gradle.wrapper.GradleWrapperMain。
对我而言,这是因为我的项目文件夹结构中有一个&符号。例如:C:\Test&Dev\MyProject
因此,gradel试图在C:\Test(削减掉&及其后面的所有内容)的根文件夹中查找gradle-wrapper.jar文件。
我通过在上述“set APP_HOME=%DIRNAME%”行下添加以下行来发现这个问题。然后运行.bat文件以查看结果。
echo "%APP_HOME%"

还有一些其他的“特殊字符”可能会破坏路径/目录。


1
这个问题的解决方法是什么?我想避免移动我的项目。谢谢! - Simon Huckett
1
这是我的问题。非常感谢您的答案! - granadaCoder

7
问题陈述很简单,就是无法定位可执行的主类文件。
如果您在项目中使用gradle wrapper,则应该具有以下结构。
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat

当你执行 ./gradlew 命令时,它会查找类路径,并根据 gradlew 或 gradlew.bat 中的代码,在类路径中添加 gradle-wrapper.jar。
现在在我的情况下,.gitignore 文件中有一个 *.jar 条目,这也排除了 gradle-wrapper.jar 在首次提交时被提交。
因此,要恢复该文件,您需要执行以下任务。
gradle wrapper

如果您未使用最新版本的Gradle,则必须在build.gradle中拥有一个包装器任务,如下所示。这定义了将打包在包装器中的Gradle版本。对于最新版本的Gradle,包装器任务是隐式的。
task wrapper(type: Wrapper) {
    gradleVersion = '4.8' 
    //change this as per your project. Refer to distributionUrl in gradle-wrapper.properties to confirm the version
}

执行该任务后,gradle-wrapper-4.8.jar 将被下载并置于 gradle/wrapper 文件夹中(如上树形结构所述)。将文件重命名为 gradle-wrapper.jar。

然而,由于 .gitignore 文件中已经排除了 *.jar ,因此我仍无法将其提交到 Github 存储库中。

因此,在 .gitignore 文件中添加以下行以将 gradle-wrapper.jar 从被忽略的 jar 列表中排除,避免受到 *.jar 的影响。

!gradle-wrapper.jar

Git已经分享了所有编程语言的示例.gitignore文件。

请参考gradle和java:


1
路径图很有用。它让我意识到我缺少 gradle-wrapper.jar 文件,这个文件在 git 中被忽略了,就像你的解释一样。 - Tyler Forsythe
@TylerForsythe 如果这对你有帮助,我很高兴。谢谢! - Sanjay Bharwani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接