我正在尝试编译一个使用 maven 的项目。
运行mvn compile结果如下错误:
[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.$ReflectUtils
Run Code Online (Sandbox Code Playgroud)
这发生在我运行它的任何地方,它不必在项目目录中。
我究竟做错了什么?
Maven 3.3.9,Ubuntu 17.04
完整输出mvn -X:
Apache Maven 3.3.9
Maven home: /usr/share/maven
Java version: 9-Ubuntu, vendor: Oracle Corporation
Java home: /usr/lib/jvm/java-9-openjdk-amd64
Default locale: en_GB, platform encoding: UTF-8
OS name: "linux", version: "4.10.0-21-generic", arch: "amd64", family: "unix"
[ERROR] Error executing Maven.
com.google.common.util.concurrent.UncheckedExecutionException: java.lang.IllegalStateException: Unable to load cache item
at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2205)
at com.google.common.cache.LocalCache.get(LocalCache.java:3951)
at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3955)
at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4870)
at com.google.common.cache.LocalCache$LocalLoadingCache.getUnchecked(LocalCache.java:4876)
at com.google.inject.internal.FailableCache.get(FailableCache.java:48)
at com.google.inject.internal.ConstructorInjectorStore.get(ConstructorInjectorStore.java:50)
at com.google.inject.internal.ConstructorBindingImpl.initialize(ConstructorBindingImpl.java:137)
at com.google.inject.internal.InjectorImpl.initializeBinding(InjectorImpl.java:533)
at com.google.inject.internal.AbstractBindingProcessor$Processor$1.run(AbstractBindingProcessor.java:160)
at com.google.inject.internal.ProcessedBindingData.initializeBindings(ProcessedBindingData.java:44)
at com.google.inject.internal.InternalInjectorCreator.initializeStatically(InternalInjectorCreator.java:123)
at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:107)
at com.google.inject.Guice.createInjector(Guice.java:99)
at com.google.inject.Guice.createInjector(Guice.java:73)
at com.google.inject.Guice.createInjector(Guice.java:62)
at org.codehaus.plexus.DefaultPlexusContainer.addPlexusInjector(DefaultPlexusContainer.java:481)
at org.codehaus.plexus.DefaultPlexusContainer.<init>(DefaultPlexusContainer.java:206)
at org.apache.maven.cli.MavenCli.container(MavenCli.java:545)
at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:281)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:199)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:547)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
Caused by: java.lang.IllegalStateException: Unable to load cache item
at com.google.inject.internal.cglib.core.internal.$LoadingCache.createEntry(LoadingCache.java:79)
at com.google.inject.internal.cglib.core.internal.$LoadingCache.get(LoadingCache.java:34)
at com.google.inject.internal.cglib.core.$AbstractClassGenerator$ClassLoaderData.get(AbstractClassGenerator.java:116)
at com.google.inject.internal.cglib.core.$AbstractClassGenerator.create(AbstractClassGenerator.java:291)
at com.google.inject.internal.cglib.reflect.$FastClass$Generator.create(FastClass.java:65)
at com.google.inject.internal.BytecodeGen.newFastClass(BytecodeGen.java:204)
at com.google.inject.internal.DefaultConstructionProxyFactory.create(DefaultConstructionProxyFactory.java:55)
at com.google.inject.internal.ProxyFactory.create(ProxyFactory.java:159)
at com.google.inject.internal.ConstructorInjectorStore.createConstructor(ConstructorInjectorStore.java:90)
at com.google.inject.internal.ConstructorInjectorStore.access$000(ConstructorInjectorStore.java:29)
at com.google.inject.internal.ConstructorInjectorStore$1.create(ConstructorInjectorStore.java:37)
at com.google.inject.internal.ConstructorInjectorStore$1.create(ConstructorInjectorStore.java:33)
at com.google.inject.internal.FailableCache$1.load(FailableCache.java:37)
at com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3540)
at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2321)
at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2284)
at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2199)
... 28 more
Caused by: java.lang.NoClassDefFoundError: Could not initialize class com.google.inject.internal.cglib.core.$ReflectUtils
at com.google.inject.internal.cglib.reflect.$FastClassEmitter.<init>(FastClassEmitter.java:67)
at com.google.inject.internal.cglib.reflect.$FastClass$Generator.generateClass(FastClass.java:77)
at com.google.inject.internal.cglib.core.$DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
at com.google.inject.internal.cglib.core.$AbstractClassGenerator.generate(AbstractClassGenerator.java:329)
at com.google.inject.internal.cglib.core.$AbstractClassGenerator$ClassLoaderData$3.apply(AbstractClassGenerator.java:93)
at com.google.inject.internal.cglib.core.$AbstractClassGenerator$ClassLoaderData$3.apply(AbstractClassGenerator.java:91)
at com.google.inject.internal.cglib.core.internal.$LoadingCache$2.call(LoadingCache.java:54)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at com.google.inject.internal.cglib.core.internal.$LoadingCache.createEntry(LoadingCache.java:61)
... 44 more
Run Code Online (Sandbox Code Playgroud)
Val*_*ler 43
我遇到了同样的问题。这是由于maven 3.6.3与jdk17不兼容。
遗憾的是我无法通过 Ubuntu 包管理器更新到 3.8.3,所以我手动安装了它。
ubuntu上安装步骤如下:
Maven 3.3+ 需要安装 JDK 1.7 或更高版本。
(可能已经过时了,因此你遇到这个问题是因为你使用了太新颖的JDK)
下载 Apache Maven。我安装了3.8.4,你可以在这里检查最新版本: https: //maven.apache.org/download.cgi
我们将存档保存到/tmp
$ TMP_MAVEN_VERSION=3.8.4
$ wget https://apache.org/dist/maven/maven-3/$TMP_MAVEN_VERSION/binaries/apache-maven-$TMP_MAVEN_VERSION-bin.tar.gz -P /tmp
Run Code Online (Sandbox Code Playgroud)
然后解压/opt并删除存档
$ sudo tar xf /tmp/apache-maven-*.tar.gz -C /opt
$ sudo rm /tmp/apache-maven-*-bin.tar.gz
Run Code Online (Sandbox Code Playgroud)
接下来我们创建一个符号链接
$ sudo ln -s /opt/apache-maven-$TMP_MAVEN_VERSION /opt/maven
Run Code Online (Sandbox Code Playgroud)
最后我们设置环境
$ sudo touch /etc/profile.d/maven.sh
$ sudo chown ubuntu /etc/profile.d/maven.sh
$ sudo bash -c 'cat << EOF > /etc/profile.d/maven.sh
export JAVA_HOME=/usr/lib/jvm/default-java
export M2_HOME=/opt/maven
export MAVEN_HOME=/opt/maven
export PATH=/opt/maven/bin:$PATH
EOF'
Run Code Online (Sandbox Code Playgroud)
(这假设 Java 在提供的路径中可用。如果使用了错误的 Java,找到当前 Java 路径的方法是运行dirname $(dirname $(readlink -f $(which javac)))。)
要在不重新启动 shell 的情况下使用它,我们将其设为可执行并运行它
$ sudo chmod +x /etc/profile.d/maven.sh
$ source /etc/profile.d/maven.sh
Run Code Online (Sandbox Code Playgroud)
现在您可以验证它是否已正确安装
$ mvn -v
Apache Maven 3.8.4 (9b656c72d54e5bacbed989b64718c159fe39b537)
Maven home: /opt/maven
Java version: 11.0.13, vendor: Ubuntu, runtime: /usr/lib/jvm/java-11-openjdk-amd64
Default locale: en, platform encoding: UTF-8
OS name: "linux", version: "5.11.0-1022-aws", arch: "amd64", family: "unix"
Run Code Online (Sandbox Code Playgroud)
为了方便起见,我添加了一个带有 bash 脚本的公共要点来准备您的系统,您可以重新启动或运行一个附加命令才能使用它:
source /etc/profile.d/maven.sh
Run Code Online (Sandbox Code Playgroud)
https://gist.github.com/Illutax/683483a4f50a749ea77bff0cb9637dea
此脚本采用一个可选参数来安装替代版本。
像这样运行它:sh maven-install.sh 3.8.4 && source /etc/profile.d/maven.sh就可以了
源自linuxize.com上的一篇文章。
Jor*_* P. 40
当使用 OpenJDK 17 时,我在 Ubuntu/Mint 20.04 中遇到了同样的问题。我发现 OpenJDK 11 运行良好。
要考虑的关键要素:
# Have version 11 installed
sudo apt install openjdk-11-jdk
# Update alternatives to use version 11 as default
sudo update-alternatives --config java
# Set the JAVA_HOME environment variable accordingly
export JAVA_HOME=/usr/lib/jvm/java-1.11.0-openjdk-amd64
Run Code Online (Sandbox Code Playgroud)
看起来那个版本的 maven 不适用于 Java 9,但它适用于 Java 8。
确保您安装了相关的软件包,例如..
sudo apt install openjdk-8-jre openjdk-8-jdk
Run Code Online (Sandbox Code Playgroud)
然后确保 maven 使用正确的版本。最简单的方法是在~/.mavenrc(如果需要,创建它)的末尾添加以下行:
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/
Run Code Online (Sandbox Code Playgroud)
(您可能需要四处寻找/usr/lib/jvm/所需的确切名称,因为您的系统可能会有所不同)
这似乎是ubuntu 特定的问题,因为使用了自定义 Maven。对我来说最好的解决方案是切换到 sdkman 的 maven 构建,而不必处理 maven 升级(我的组织使用 http 工件,因此 3.8 需要很多解决方法):
sdk install maven 3.6.3
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8809 次 |
| 最近记录: |