java - 切换到 JPMS(Java 平台模块系统)时出现 Spring NoSuchBeanDefinitionException
问题描述
我正在尝试将一个大型项目迁移到 JPMS(Java 平台模块系统)。
它包含一些给我带来麻烦的 Spring 组件。我创建了一个测试仓库来演示这个问题。当我删除 module-info.java 文件时,它工作得很好,如TestControllerTest.java中的测试所示。但是,如果我添加 module-info.java 那么它会停止工作并出现以下异常:
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'RESTConfiguration': Unsatisfied dependency expressed through field 'fooAuthenticationProvider'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.spacemetric.spring.jpmstest.auth.FooAuthenticationProvider' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at spring.beans@5.2.6.RELEASE/org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:643)
at spring.beans@5.2.6.RELEASE/org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:130)
at …
堆栈跟踪似乎表明ApplicationContext
无法找到@Autowired
实现。我已经打开了整个模块进行深度反思。我高度未受教育的猜测是,这可能与类路径与模块路径有关,但我不知道该怎么做。
module-info.java 文件如下:
open module com.spacemetric.spring.jpmstest {
requires spring.core;
requires spring.context;
requires spring.beans;
requires spring.security.config;
requires spring.security.web;
requires spring.webmvc;
requires spring.security.core;
requires javax.servlet.api;
requires spring.web;
}
以下是 Eclipse 用来运行测试的命令行(根据要求):
C:\Program Files\Java\java-11-openjdk-11.0.7.10-1.windows.redhat.x86_64\bin\javaw.exe -ea --add-opens com.spacemetric.spring.jpmstest/com.spacemetric。 spring.jpmstest=ALL-UNNAMED --add-modules=ALL-MODULE-PATH -Dfile.encoding=UTF-8 -p "C:\dev\source\spring-jpms-test\target\classes;C:\Users \Oscar Haglund.m2\repository\org\springframework\spring-core\5.2.6.RELEASE\spring-core-5.2.6.RELEASE.jar;C:\Users\Oscar Haglund.m2\repository\org\springframework\ security\spring-security-web\5.3.2.RELEASE\spring-security-web-5.3.2.RELEASE.jar;C:\Users\Oscar Haglund.m2\repository\org\springframework\security\spring-security- core\5.3.2.RELEASE\spring-security-core-5.3.2.RELEASE.jar;C:\Users\Oscar Haglund.m2\repository\org\springframework\spring-beans\5.2.6.RELEASE\spring- beans-5.2.6.RELEASE.jar;C:\Users\Oscar Haglund。m2\repository\org\springframework\spring-context\5.2.6.RELEASE\spring-context-5.2.6.RELEASE.jar;C:\Users\Oscar Haglund.m2\repository\org\springframework\spring-web\ 5.2.6.RELEASE\spring-web-5.2.6.RELEASE.jar;C:\Users\Oscar Haglund.m2\repository\org\springframework\security\spring-security-config\5.3.2.RELEASE\spring- security-config-5.3.2.RELEASE.jar;C:\Users\Oscar Haglund.m2\repository\org\springframework\spring-webmvc\5.2.6.RELEASE\spring-webmvc-5.2.6.RELEASE.jar; C:\Users\Oscar Haglund.m2\repository\javax\servlet\javax.servlet-api\3.1.0\javax.servlet-api-3.1.0.jar" -classpath "C:\Users\Oscar Haglund.m2 \repository\org\springframework\spring-jcl\5.2.6.RELEASE\spring-jcl-5.2.6.RELEASE.jar;C:\Users\Oscar Haglund.m2\repository\org\springframework\spring-aop\5.2 .6.RELEASE\spring-aop-5.2.6.RELEASE.jar;C:\Users\Oscar Haglund。m2\repository\org\springframework\spring-expression\5.2.6.RELEASE\spring-expression-5.2.6.RELEASE.jar;C:\Users\Oscar Haglund.m2\repository\org\junit\jupiter\junit- jupiter-engine\5.7.0\junit-jupiter-engine-5.7.0.jar;C:\Users\Oscar Haglund.m2\repository\org\apiguardian\apiguardian-api\1.1.0\apiguardian-api-1.1。 0.jar;C:\Users\Oscar Haglund.m2\repository\org\junit\platform\junit-platform-engine\1.7.0\junit-platform-engine-1.7.0.jar;C:\Users\Oscar Haglund.m2\repository\org\opentest4j\opentest4j\1.2.0\opentest4j-1.2.0.jar;C:\Users\Oscar Haglund.m2\repository\org\junit\platform\junit-platform-commons\1.7。 0\junit-platform-commons-1.7.0.jar;C:\Users\Oscar Haglund.m2\repository\org\junit\jupiter\junit-jupiter-api\5.7.0\junit-jupiter-api-5.7。 0.jar;C:\Users\Oscar Haglund.m2\repository\org\springframework\spring-test\5.2.6.RELEASE\spring-test-5.2.6.RELEASE.jar;C:\Users\Oscar Haglund.m2\repository\org\springframework\restdocs\spring-restdocs-mockmvc\2.0.5.RELEASE\spring-restdocs-mockmvc-2.0.5.RELEASE.jar;C:\Users\Oscar Haglund.m2\repository\org\springframework\restdocs\spring-restdocs-core\2.0.5.RELEASE\spring-restdocs-core-2.0.5.RELEASE.jar;C:\Users\Oscar Haglund.m2\repository\ com\fasterxml\jackson\core\jackson-databind\2.9.5\jackson-databind-2.9.5.jar;C:\Users\Oscar Haglund.m2\repository\com\fasterxml\jackson\core\jackson-annotations\ 2.9.0\jackson-annotations-2.9.0.jar;C:\Users\Oscar Haglund.m2\repository\com\fasterxml\jackson\core\jackson-core\2.9.5\jackson-core-2.9.5。 jar;C:\Users\Oscar Haglund.m2\repository\org\mockito\mockito-junit-jupiter\3.5.10\mockito-junit-jupiter-3.5.10.jar;C:\Users\Oscar Haglund.m2\存储库\org\mockito\mockito-core\3.5.10\mockito-core-3.5.10.jar;C:\Users\Oscar Haglund。m2\repository\net\bytebuddy\byte-buddy\1.10.13\byte-buddy-1.10.13.jar;C:\Users\Oscar Haglund.m2\repository\net\bytebuddy\byte-buddy-agent\1.10。 13\byte-buddy-agent-1.10.13.jar;C:\Users\Oscar Haglund.m2\repository\org\objenesis\objenesis\3.1\objenesis-3.1.jar;C:\Users\Oscar Haglund.m2\存储库\org\junit\platform\junit-platform-launcher\1.7.0\junit-platform-launcher-1.7.0.jar;C:\dev\eclipse\configuration\org.eclipse.osgi\259\0.cp ;C:\dev\eclipse\configuration\org.eclipse.osgi\257\0.cp" --patch-module "com.spacemetric.spring.jpmstest=C:\dev\source\spring-jpms-test\target \test-classes" --add-reads com.spacemetric.spring.jpmstest=ALL-UNNAMED org.eclipse.jdt.internal.junit.runner.RemoteTestRunner -version 3 -port 55245 -testLoaderClass org.eclipse.jdt.internal。 junit5.runner.JUnit5TestLoader -loaderpluginname org.eclipse.jdt.junit5。运行时-classNames com.spacemetric.spring.jpmstest.TestControllerTest
解决方案
首先放入module-info.java
in src/main/java
,而不是 in src/test/java
。我也将其稍微更改为:
module spring.jpms.test {
requires spring.core;
requires spring.context;
requires spring.beans;
requires spring.security.config;
requires spring.security.web;
requires spring.webmvc;
requires spring.security.core;
requires javax.servlet.api;
requires spring.web;
opens com.spacemetric.spring.jpmstest;
}
但无论如何,这只能“部分”解决,因为:
modules
欢迎来到和spring
(或一般的工具)的一个相当粗糙的现实。看看这里,人们有同样的问题。我发现的唯一可行的解决方案是:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M5</version>
<configuration>
<useModulePath>false</useModulePath>
</configuration>
</plugin>
这适用于mvn clean install
(和junit5
),我还没有尝试或玩过足够的intellij
东西来使它工作。
推荐阅读
- git - 如何删除我在 3 天前提交的 github 上的提交而不会丢失以后的数据?
- javascript - 将功能作为道具发送给它时反应组件重新渲染
- c++ - C++ 函数可能会根据传递的参数返回不同的向量 - 但我收到编译器警告
- php - 将一个数组缩减为另一个数组
- python - 如何在类中传递方法的返回值?
- ansible - 根据变量更改 ansible 库存
- ios - 当应用程序在后台时,显示带有 NotificationHub 的 Xamarin iOS 通知而不调用 DidReceiveRemoteNotification
- wordpress - 将所有子 url 重定向到主 url
- vb.net - 运行时错误 System.Security.Cryptography.CryptographicException:'错误数据。' 在 vb.net 中尝试导入 RSA 参数时
- symfony - 仅针对某些实体的 Log Doctrine Insert/Update Statements