Ubuntu 20.04
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)
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
:
/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,如下图:
可见,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)并改为使用它?
在浏览器里,打开 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:system
和 mvn clean install
命令了。
最后,别忘了最好还是把IntelliJ的Maven改为和命令行Maven一致。