Maven:发生了非法反射访问操作

32
在执行任何mvn命令时,我会在日志的开头收到以下警告:
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.google.inject.internal.cglib.core.$ReflectUtils$1 (file:/usr/share/maven/lib/guice.jar) to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain)
WARNING: Please consider reporting this to the maintainers of com.google.inject.internal.cglib.core.$ReflectUtils$1
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release

不幸的是,这些警告有时会导致运行时错误并破坏我的Maven命令执行。有人知道如何解决这个问题,并摆脱这些警告吗?

我的Maven版本:

Apache Maven 3.5.2
Maven home: /usr/share/maven
Java version: 11.0.2, vendor: Azul Systems, Inc.
Java home: /usr/lib/jvm/zulu-11-amd64
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "4.15.0-47-generic", arch: "amd64", family: "unix"
7个回答

30

我的最佳猜测是:你的 guice 版本与 Java 11 不兼容。


2
发现我的Guice版本与我的Maven安装相关联。由于我的发行版源没有更新,最终从apache.org下载了Maven 3.6.2二进制文件,并更新了环境以使用它,而不是我系统上的3.6.0版本。 - karmakaze

25

我正在使用Debian,下面的命令为我消除了这个警告。
我也在使用OpenJDK 11。

# Download maven 3.6.3
wget https://www.apache.org/dist/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz -P /tmp

# Untar downloaded file to /opt
sudo tar xf /tmp/apache-maven-*.tar.gz -C /opt

# Install the alternative version for the mvn in your system
sudo update-alternatives --install /usr/bin/mvn mvn /opt/apache-maven-3.6.3/bin/mvn 363

# Check if your configuration is ok. You may use your current or the 3.6.3 whenever you wish, running the command below.
sudo update-alternatives --config mvn

运行最终命令时,您应该选择 Maven 版本 3.6.3。
之后警告将被移除。


截至2020年10月12日,该指令在Ubuntu 18.04上仍可使用。但是,对于tar xf也需要sudo。这个解决方案消除了警告。 - Yu Shen
很奇怪的是,在Ubuntu上安装的Maven版本是3.6.3,却表现出这种行为。它可能是使用不同的JDK编译或针对不同的目标编译的。 - oligofren

10

正如JF Meier在这里所提到的,我的guice版本与Java 11不兼容。通过使用sdkman重新安装maven解决了这个问题。


7
为什么不接受他的答案,而是要创造自己的答案并接受自己的答案呢? - nom-mon-ir
1
我这么做是因为这是解决问题的方法。 - wero026
4
你应该接受JF Meier的答案,只需在重新安装部分添加一条评论即可。 - ngiallelis
4
他解决问题的方式很好...第一个回答显然不是一个答案,只是重申了问题,并且提供了情况的概述。提问者补充了他为解决问题所做的事情,这是鼓励在该论坛上进行的。 - TheGeeko61

9
如果您使用的是自定义版本的Maven或者Ubuntu WSL,那么请移除Maven并从官方网站下载并安装 Maven
例如,如果您有WSL,并且假设您有一个/c/tools目录:
$ sudo apt-get remove maven
$ cd /c/tools/
$ tar xzvf /c/Users/<USER-NAME>/Downloads/apache-maven-3.6.3-bin.tar.gz
$ echo "PATH=/c/tools/apache-maven-3.6.3/bin:$PATH" >> ~/.profile
$ source ~/.profile
$ mvn -v
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /c/tools/apache-maven-3.6.3
Java version: 11.0.8, vendor: Ubuntu, runtime: /usr/lib/jvm/java-11-openjdk-amd64
Default locale: en, platform encoding: UTF-8
OS name: "linux", version: "4.4.0-18362-microsoft", arch: "amd64", family: "unix"

2
这对我来说是解决方案。其他的都在WSL2中无法工作。 - trash80

2

即使使用最近的Maven发行版,我仍然遇到了问题。似乎打包的Mint版本重复使用了libguice-java包而没有使用guice-4.2.1-no_aop.jar

因此,从Maven网站安装二进制文件可以解决此问题。


2
我刚在guice项目的存储库https://github.com/google/guice/issues/1216#issuecomment-742417433上看到了这条评论,与你在这里提到的一致。 - Gotxi

1

最近我遇到了这个问题,在我的情况下,我使用的是较旧版本的Spring。 所以我从这个版本做出了更改:

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.2.RELEASE</version>

到这里

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.5.RELEASE</version>

并且这对我的情况起作用了


0
Guice刚刚发布了新版本v5.0.1。升级到此版本应该可以解决问题,而无需将Java版本降级至11。
在Guice的Github上也有一个问题与此完全相同。

1
不太好,因为你必须从那时起构建和维护它。最好从Apache Maven安装Maven 3.6.3(而不是从Ubuntu、Mint等安装)。 - Russ Bateman

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