运行 来自 IntelliJ IDEA 的 SpringBoot 应用程序无法用于模块化项目

Running SpringBoot app from IntelliJ IDEA fails for modular project

我的项目是一个 Spring 启动应用程序,其中包含一个 java 模块。此模块不 open 它的任何软件包。

模块-info.java

module my.somewhere
{ 
    requires spring.core;
    requires spring.context;
    requires spring.boot;
    // and so on
}

从命令行 mvn clean spring-boot:run.

调用时,应用 运行 如预期

但是当我尝试从 SpringBootApplication 的主要方法启动它时,控制台中出现以下错误:java.lang.IllegalAccessException: module my.somewhere does not open my.somewhere.abc to module spring.core(请参阅下面的详细堆栈)。

由于其反射操作,将某些内容打开 Spring 看起来是合理的,但我想知道为什么 maven 设法 运行 它没有问题。

请帮助我了解如何从 Maven 3.6.1IntelliJ IDEA 2019.3.

中类似地制作应用程序 运行

详细堆栈:

org.springframework.cglib.core.CodeGenerationException: java.lang.IllegalAccessException-->module my.somewhere does not open my.somewhere.abc to module spring.core
    at spring.core@5.2.4.RELEASE/org.springframework.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:514) ~[spring-core-5.2.4.RELEASE.jar:na]
    at spring.core@5.2.4.RELEASE/org.springframework.cglib.core.AbstractClassGenerator.generate(AbstractClassGenerator.java:363) ~[spring-core-5.2.4.RELEASE.jar:na]
    at spring.core@5.2.4.RELEASE/org.springframework.cglib.proxy.Enhancer.generate(Enhancer.java:582) ~[spring-core-5.2.4.RELEASE.jar:na]
    at spring.core@5.2.4.RELEASE/org.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData.apply(AbstractClassGenerator.java:110) ~[spring-core-5.2.4.RELEASE.jar:na]
    at spring.core@5.2.4.RELEASE/org.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData.apply(AbstractClassGenerator.java:108) ~[spring-core-5.2.4.RELEASE.jar:na]
    at spring.core@5.2.4.RELEASE/org.springframework.cglib.core.internal.LoadingCache.call(LoadingCache.java:54) ~[spring-core-5.2.4.RELEASE.jar:na]
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na]
    at spring.core@5.2.4.RELEASE/org.springframework.cglib.core.internal.LoadingCache.createEntry(LoadingCache.java:61) ~[spring-core-5.2.4.RELEASE.jar:na]
    at spring.core@5.2.4.RELEASE/org.springframework.cglib.core.internal.LoadingCache.get(LoadingCache.java:34) ~[spring-core-5.2.4.RELEASE.jar:na]
    at spring.core@5.2.4.RELEASE/org.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData.get(AbstractClassGenerator.java:134) ~[spring-core-5.2.4.RELEASE.jar:na]
    at spring.core@5.2.4.RELEASE/org.springframework.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:319) ~[spring-core-5.2.4.RELEASE.jar:na]
    at spring.core@5.2.4.RELEASE/org.springframework.cglib.proxy.Enhancer.createHelper(Enhancer.java:569) ~[spring-core-5.2.4.RELEASE.jar:na]
    at spring.core@5.2.4.RELEASE/org.springframework.cglib.proxy.Enhancer.createClass(Enhancer.java:416) ~[spring-core-5.2.4.RELEASE.jar:na]
    at spring.context@5.2.4.RELEASE/org.springframework.context.annotation.ConfigurationClassEnhancer.createClass(ConfigurationClassEnhancer.java:137) ~[spring-context-5.2.4.RELEASE.jar:na]
    at spring.context@5.2.4.RELEASE/org.springframework.context.annotation.ConfigurationClassEnhancer.enhance(ConfigurationClassEnhancer.java:109) ~[spring-context-5.2.4.RELEASE.jar:na]
    at spring.context@5.2.4.RELEASE/org.springframework.context.annotation.ConfigurationClassPostProcessor.enhanceConfigurationClasses(ConfigurationClassPostProcessor.java:423) ~[spring-context-5.2.4.RELEASE.jar:na]
    at spring.context@5.2.4.RELEASE/org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanFactory(ConfigurationClassPostProcessor.java:257) ~[spring-context-5.2.4.RELEASE.jar:na]
    at spring.context@5.2.4.RELEASE/org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:286) ~[spring-context-5.2.4.RELEASE.jar:na]
    at spring.context@5.2.4.RELEASE/org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:130) ~[spring-context-5.2.4.RELEASE.jar:na]
    at spring.context@5.2.4.RELEASE/org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:706) ~[spring-context-5.2.4.RELEASE.jar:na]
    at spring.context@5.2.4.RELEASE/org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:532) ~[spring-context-5.2.4.RELEASE.jar:na]
    at spring.boot@2.2.5.RELEASE/org.springframework.boot.web.reactive.context.ReactiveWebServerApplicationContext.refresh(ReactiveWebServerApplicationContext.java:66) ~[spring-boot-2.2.5.RELEASE.jar:na]
    at spring.boot@2.2.5.RELEASE/org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747) ~[spring-boot-2.2.5.RELEASE.jar:na]
    at spring.boot@2.2.5.RELEASE/org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) ~[spring-boot-2.2.5.RELEASE.jar:na]
    at spring.boot@2.2.5.RELEASE/org.springframework.boot.SpringApplication.run(SpringApplication.java:315) ~[spring-boot-2.2.5.RELEASE.jar:na]
    at spring.boot@2.2.5.RELEASE/org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) ~[spring-boot-2.2.5.RELEASE.jar:na]
    at spring.boot@2.2.5.RELEASE/org.springframework.boot.SpringApplication.run(SpringApplication.java:1215) ~[spring-boot-2.2.5.RELEASE.jar:na]
    at my.somewhere@0.0.2/my.somewhere.MyApplication.main(MyApplication.java:11) ~[classes/:na]
Caused by: java.lang.IllegalAccessException: module my.somewhere does not open my.somewhere.abc to module spring.core
    at java.base/java.lang.invoke.MethodHandles.privateLookupIn(MethodHandles.java:202) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
    at spring.core@5.2.4.RELEASE/org.springframework.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:508) ~[spring-core-5.2.4.RELEASE.jar:na]
    ... 27 common frames omitted

因为如果你 运行 它与 mvn clean spring-boot:run 你所有的 类 和 JAR 都在类路径中而不是模块路径中。

所以当运行使用 maven 插件或作为可执行 JAR 将其连接时,没有模块系统。

在模块声明之前放置 open 为我修复它:

open module my.somewhere
{ 
    requires spring.core;
    requires spring.context;
    requires spring.boot;
    // and so on
}