[英]Is ActiveMQ Artemis Java JPMS (Java Platform Module System) compatible?
[英]Spring NoSuchBeanDefinitionException when switching to JPMS (Java Platform Module System)
我正在嘗試將一個大型項目遷移到 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-anno tations-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\\repository\\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\\repository\\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" --補丁模塊“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.runtime -classNames com.spacemetric.spring .jpmstest.TestControllerTest
首先,將module-info.java
放在src/main/java
,而不是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
使其工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.