找不到或加载主类org.apache.maven.wrapper.MavenWrapperMain。

63

我这里有一个 Spring Boot 项目:https://github.com/jcasbin/jcasbin-springboot-plugin。我在 Travis CI 中遇到了以下错误:

shell
3.43s$ ./mvnw install -DskipTests=true -Dmaven.javadoc.skip=true -B -V
/home/travis/build/jcasbin/jcasbin-springboot-plugin
Picked up _JAVA_OPTIONS: -Xmx2048m -Xms512m
Error: Could not find or load main class org.apache.maven.wrapper.MavenWrapperMain
The command "eval ./mvnw install -DskipTests=true -Dmaven.javadoc.skip=true -B -V " failed. Retrying, 2 of 3.

看起来mvnw命令失败了。这个文件是由我的IDE生成的:IntelliJ IDEA 2018.1。我不知道它用来做什么,为什么会失败?

我已经在Spring Boot的github issues这里发表了问题,但Spring项目表示这是Maven包装器的问题,并指向了这里。我不太明白这是什么意思。这是一个Maven bug吗?如何修复错误?


也许你可以看一下如何创建一个最小、完整和可验证的示例……我相信没有人愿意从零开始阅读和理解你的代码。 - 0x1C1B
这不是错误,你需要查看“mvn install”的Maven输出日志。 - Nyamiou The Galeanthrope
8个回答

120

Phil的回答是正确的。以下是如何创建带有所需jar的.mvn目录。
我在这里找到了答案 (https://www.baeldung.com/maven-wrapper)

如果您拥有maven并且想要使maven wrapper工作,您需要设置maven wrapper:

mvn -N io.takari:maven:wrapper

它应该创建一个 .mvn 目录并将所需的 jar 放入其中。


10
虽然@PhilWebb的回答可能是正确的,但它只涉及到了诊断而没有提到解决方法。这很有帮助,但takari是什么,是否有标准库/软件包? - perennial_noob
这帮助我们让我们的JHipster应用程序正常工作 - 谢谢。 - Gel
如果您使用的是Windows操作系统,请确保您拥有“wrapper/maven-wrapper.jar”文件。 - heyomi
你可以查看以下内容:https://github.com/takari/maven-wrapper https://maven.apache.org/wrapper/mvn wrapper:wrapper - Néstor Waldyd

85

你的git仓库中缺少.mvn文件夹。你应该有一个名为.mvn的文件夹,其中包含wrapper/maven-wrapper.jarwrapper/maven-wrapper.propertiesjvm.config文件。也许你错过了它,因为它是一个隐藏的文件夹。

尝试从命令行中执行git add -f .mvn,然后提交和推送。


1
请注意,我实际上已经创建了 .mvn 目录,但由于某种原因仍然需要执行此操作。 - mslissap
1
在我的情况下,我有 .mvn 目录,但我需要安装 git-lfs 才能正确检出 maven-wrapper.jar(否则它会被替换为文本文件)。 - Rolintocour

9

"我不知道它的用途是什么":

mvnw是一个Maven wrapper。基本上,它是一个脚本,将Maven与您的本地安装分离,并可能为实际的mvn命令添加检查和功能 - 详细解释请查看官方Maven文档

要设置它(假设您仅使用mvn运行),只需要运行:

    mvn wrapper:wrapper 

这将至少创建以下新文件:

    .
    ├── .mvn
    │   └── wrapper
    │       ├── maven-wrapper.jar
    │       └── maven-wrapper.properties
    ├── mvnw
    └── mvnw.cmd

接着,通过调用 mvnw 命令,您可以完全独立于本地 Maven 安装运行所有内容,而不会受到影响。

如果在命令执行后 maven-wrapper.jar 未就位,则可能存在网络问题 - 最常见的是需要进行配置的代理。

«如何解决»:

问题是什么?

代理问题:

起初,mvn wrapper:wrapper 无法为我获取 maven-wrapper.jar

.
├── .mvn
│   └── wrapper
│       └── maven-wrapper.properties
├── mvnw
└── mvnw.cmd

如果你深入研究这个问题并查看实际的包装器代码 wrapper code,你会注意到它没有默认代理 - 但是你可以通过创建一个包含以下内容的.mvn/jvm.config文件为Java虚拟机设置代理:
    -Dhttp.proxyHost=proxy.domain.name
    -Dhttp.proxyPort=8080
    -Dhttps.proxyHost=proxy.domain.name
    -Dhttps.proxyPort=8080 

有了这个设置,只需重新运行安装命令即可。

    mvn wrapper:wrapper

自动获取所有内容:

    .
    ├─ .mvn
    │  ├── jvm.config
    │  └── wrapper
    │      ├── maven-wrapper.jar
    │      └── maven-wrapper.properties
    ├── mvnw
    └── mvnw.cmd

现在,运行 ./mvnw clean install 命令应该可以正常工作 - 我成功过(但只坚持了几天)。

类问题:

有一天,我来到办公室,发现 mvnw 返回了您所述的相同错误!...

对我来说,问题实际上是 jvm.config 文件中的换行符(LF <-> CRLF)问题。

由于 mvnw 脚本会将选项扩展为一个实际命令,因此在类路径选项之前被 CR 截断,导致命令混乱。 由于类路径是传递 MaveWrapperMain 的 maven-wrapper.jar 的位置,Java 命令实际上无法获取类。

我如何解决它:

我只是重新创建了只包含 LF 而没有 CRLF 的文件。

Bonus:

由于我注意到这个 CRLF 是由 Windows 机器上的用户引入的,我检查了一些git 文档以避免重复此问题,运行了以下命令,并建议每个人都这样做:

    git config --global core.autocrlf true

希望这个总结能够整合我发现的零散步骤,为某些人节省时间。

8
  1. 除了Oleksii Volynskyi所说的,

使用官方的Maven Wrapper

mvn wrapper:wrapper

而不是io.takari:maven:wrapper,因为后者已经不再维护了

  1. 如Phil Webb所提到的,将.mvn文件夹添加到git仓库中

5

对于使用 Windows 的用户看到这个错误,请检查 .mvn 文件夹中的文件是否被转换为 CRLF。如果是,将它们更改为 LF 可能会解决您的问题。


4

在我的情况下,我将项目保存在一个文件夹中,该文件夹的路由包含一个带重音符号的字符(在我的情况下是“á”)。去掉重音符号解决了问题。


1
这就是我的情况。 - TiyebM
1
冒号(:)也会出现问题... - ss1

0
在我的情况下,有一个 .dockerignore 文件,你可以在其中选择所有应该考虑的 jar 文件,而 .mvn 中的文件却不在其中,因此出现了错误。

-2

我实际上只是执行了mvn clean install命令,它可以正常工作,我实际上正在使用更旧的Spring 2.0版本来明确。


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