【问题标题】:How to pass --illegal-access JVM argument to spring boot maven plugin如何将 --illegal-access JVM 参数传递给 Spring Boot Maven 插件
【发布时间】:2021-10-03 08:26:09
【问题描述】:

我有一个从命令提示符运行时运行良好的应用程序:

java -jar --illegal-access=permit target/Something.jar

但是,在我的 pom.xml 中配置我的 spring boot maven 插件会给我同样的错误,就像我在没有 illegal-access=permit 部分的情况下运行我的 cmd 一样,告诉我它被忽略了:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <executions>
        <execution>
            <goals>
                <goal>repackage</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <mainClass>com.something.PreMain</mainClass>
        <jvmArguments>
            --illegal-access=permit
        </jvmArguments>
    </configuration>
</plugin>

我做错了什么?这个应用程序在 java 14 中运行良好,我正在升级到 java 16。除了 intelliJ 由于缺少 illegal-access=permit JVM 参数而无法在调试模式下启动它之外,一切仍然运行良好。

【问题讨论】:

  • 请注意:--illegal-access JVM 参数将 essentially become a no-op in Java 17
  • 正确,我使用的很多库还是需要正确适配Java 16,这个是暂时的
  • 尝试使用--illegal-access=warn(或调试)查看发生了什么问题。正如documentation 中所说,您正在使用可能会消失的内部东西。我想如果你对 java 16 有问题,它可能已经消失了,它适用于 java 14。
  • 它在命令提示符下运行时可以工作,它也应该在 intelliJ no 下工作?
  • @Martin 如果您通过 IntelliJ 运行应用程序,请尝试在配置中添加参数。您可以在问题中分享有关如何执行应用程序的确切步骤,并添加 IntelliJ 标记而不是任何其他标记。

标签: java spring-boot jvm-arguments spring-boot-maven-plugin java-16


【解决方案1】:

您可能想尝试将其放入属性中。试试这个:

<properties>
    <jvm.options>--illegal-access=permit</jvm.options>
</properties>

然后在插件中使用如下:

<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
    <execution>
        <goals>
            <goal>repackage</goal>
        </goals>
    </execution>
</executions>
<configuration>
    <mainClass>com.something.PreMain</mainClass>
    <compilerArgs>
       <arg>${jvm.options}</arg>
    </compilerArgs>
</configuration>

注意:如果您正在访问非法访问参数,则需要使用 argline 而不是 args。

【讨论】:

    【解决方案2】:

    如果您尝试在 IntelliJ 中运行应用程序,则无需向 Maven 传递任何内容。在 IntelliJ 中,打开应用程序的运行配置,然后在 Environment->VM options 下添加 --illegal-access=permit。请参阅附图,主类将是您的 @SpringBootApplication 类的完全限定位置,例如com.something.MySpringBootApplication

    当您在 IntelliJ 中以调试模式启动应用时,您会看到类似

    /Library/Java/JavaVirtualMachines/jdk-16.0.2.jdk/Contents/Home/bin/java -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:52737,suspend=y,server=n --illegal-access=permit -XX:TieredStopAtLevel=1...,请注意传递给您的应用的参数。

    【讨论】:

    • 这确实有效,但这引出了一个问题:spring boot maven 插件中的 JvmArguments 部分是否有任何作用?我更喜欢这个配置驻留在 POM.xml 而不是 intelliJ 运行配置...
    • 是的,这不是很简单。 jvmArguments 选项实际上并没有传递到顶级 JVM,而是传递给从 Maven 派生出来的任何进程。因此,如果您使用 mvn spring-boot:run 运行您的应用程序,那么这些选项将传递给 Maven 分叉的 VM。
    • 我将补充您提到的不想将该配置放在两个地方的内容,在 IntelliJ 中,您可以将运行配置从 spring boot 配置更改为 maven 配置,该命令将简单是spring-boot:run。但是,这将不允许您从 IntelliJ 进行调试,因为调试器将附加到 Maven 进程,而不是 Maven 派生的进程(您的应用程序)。
    猜你喜欢
    • 1970-01-01
    • 2012-05-11
    • 2016-11-20
    • 1970-01-01
    • 1970-01-01
    • 2020-03-08
    • 2015-11-26
    • 1970-01-01
    • 2021-04-18
    相关资源
    最近更新 更多