运行Maven命令报错“java.lang.IllegalStateException: Unable to load cache item”

环境

  • 操作系统: Ubuntu 20.04
  • JDK: 17
➜  ~ java -version
java version "17.0.1" 2021-10-19 LTS
Java(TM) SE Runtime Environment (build 17.0.1+12-LTS-39)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.1+12-LTS-39, mixed mode, sharing)
  • Maven: 3.6.3
➜  ~ mvn -v
Apache Maven 3.6.3
Maven home: /usr/share/maven
Java version: 17.0.1, vendor: Oracle Corporation, runtime: /home/ding/Downloads/jdk-17.0.1
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "5.13.0-39-generic", arch: "amd64", family: "unix"

问题及分析

运行Maven命令报错,例如:

➜  ~ mvn clean install
[ERROR] Error executing Maven.
[ERROR] java.lang.IllegalStateException: Unable to load cache item
[ERROR] Caused by: Unable to load cache item
[ERROR] Caused by: Could not initialize class com.google.inject.internal.cglib.core.$MethodWrapper

事实上不仅build报错,甚至 mvn help:system 这样简单的命令都报错。

奇怪的是,在IntelliJ IDEA工具里,maven却可以正常工作。比如点击 Execute Maven Goal 图标,运行 mvn help:system

运行Maven命令报错“java.lang.IllegalStateException: Unable to load cache item”_第1张图片
结果如下:

/home/ding/Downloads/jdk-17.0.1/bin/java -Dmaven.multiModuleProjectDirectory=/home/ding/Downloads/test0402/aggregator/module1 -Dmaven.home=/home/ding/.m2/wrapper/dists/apache-maven-3.8.4-bin/52ccbt68d252mdldqsfsn03jlf/apache-maven-3.8.4 -Dclassworlds.conf=/home/ding/.m2/wrapper/dists/apache-maven-3.8.4-bin/52ccbt68d252mdldqsfsn03jlf/apache-maven-3.8.4/bin/m2.conf -Dmaven.ext.class.path=/snap/intellij-idea-community/352/plugins/maven/lib/maven-event-listener.jar -javaagent:/snap/intellij-idea-community/352/lib/idea_rt.jar=36801:/snap/intellij-idea-community/352/bin -Dfile.encoding=UTF-8 -classpath /home/ding/.m2/wrapper/dists/apache-maven-3.8.4-bin/52ccbt68d252mdldqsfsn03jlf/apache-maven-3.8.4/boot/plexus-classworlds-2.6.0.jar:/home/ding/.m2/wrapper/dists/apache-maven-3.8.4-bin/52ccbt68d252mdldqsfsn03jlf/apache-maven-3.8.4/boot/plexus-classworlds.license org.codehaus.classworlds.Launcher -Didea.version=2021.3.3 help:system
[INFO] Scanning for projects...
[INFO] 
............
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.661 s
[INFO] Finished at: 2022-04-03T08:57:21+08:00
[INFO] ------------------------------------------------------------------------

Process finished with exit code 0

其实,如果仔细看一下这段输出的内容,就能发现一些有用信息,但是一般我们也不爱看Maven这些刷屏的输出内容。于是我在网上搜索报错信息,搜了半天也没找到有用的东西,因为报错消息很含糊,搜那些错误消息很难找到相关的问题,后来在这里找到了: https://stackoverflow.com/questions/27481953/maven-java-lang-noclassdeffounderror-com-google-inject-internal-cglib-core-co ,里面有人说 maven 3.6.x is not supporting Java 17

OK,如果是这样,那我也没话说了,确实我最近把JDK升级到了17。那反过来看,IntelliJ也配置的是JDK 17,那IntelliJ里为什么就不报错呢。原因很简单,IntelliJ和命令行用的Maven版本不一样。命令行的Maven版本是 3.6.3 ,而从上面IntelliJ的mvn命令输出内容,可见Maven版本是 3.8.4 。这就能解释通了。

打开 File -> Settings 对话框,定位到Maven,如下图:

运行Maven命令报错“java.lang.IllegalStateException: Unable to load cache item”_第2张图片
可见,IntelliJ使用的是 Use Maven wrapper ,而不是 /usr/share/maven (命令行使用的Maven)。

那么Maven wrapper具体在哪儿呢?参见上面的mvn命令结果: maven.home=/home/ding/.m2/wrapper/dists/apache-maven-3.8.4-bin/52ccbt68d252mdldqsfsn03jlf/apache-maven-3.8.4

注:其实我之前配置过IntelliJ的Maven,指向的就是 /usr/share/maven ,也就是说IntelliJ和命令行的Maven是一样的,但我也不知道为啥二者现在不一样了。盲猜一下,难道是我升级了JDK 17之后,IntelliJ知道Maven 3.6.3不支持JDK 17,所以自动帮我升级了Maven wrapper(我当初配置IntelliJ的Maven时,Maven 3.8.4肯定还没有release)并改为使用它?

升级Maven

在浏览器里,打开 https://maven.apache.org/download.cgi ,下载 apache-maven-3.8.5-bin.tar.gz (最新的Maven build),解压到指定目录,最后修改 ~/.zshrc 文件(具体文件名取决于你用什么shell),把 export M2_HOME=xxx 这一行更新,然后 source 一下。

一般来说,只需做这一步就OK了,但要验证一下你的 which mvn 是指向哪里的。如果是hardcode的路径,那就得修改一下,如果是使用了 $M2_HOME 变量(即 $M2_HOME/bin/mvn ),那就不用动了。

完成之后,输入 mvn -v 命令查看Maven版本:

➜  ~ mvn -v
Apache Maven 3.8.5 (3599d3414f046de2324203b78ddcf9b5e4388aa0)
Maven home: /home/ding/Downloads/apache-maven-3.8.5-bin/apache-maven-3.8.5
Java version: 17.0.1, vendor: Oracle Corporation, runtime: /home/ding/Downloads/jdk-17.0.1
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "5.13.0-39-generic", arch: "amd64", family: "unix"

可见,Maven已经升级到 3.8.5 了。

现在就可以在命令行下使用 mvn help:systemmvn clean install 命令了。

最后,别忘了最好还是把IntelliJ的Maven改为和命令行Maven一致。

总结

  • 命令行下的Maven报错信息很垃圾(针对本问题);
  • 查看输出内容,里面通常包含了有用的信息,不要对其视而不见(比如mvn命令的刷屏输出);
  • 不要想当然(我想当然的认为IntelliJ和命令行下的JDK和Maven都是一样的,却不知何时IntelliJ里的Maven已经被修改了),要用事实说话;

你可能感兴趣的:(maven)