Spring NoSuchBeanDefinitionException beim Wechsel zu JPMS (Java Platform Module System)
Ich versuche, ein großes Projekt auf JPMS (Java Platform Module System) zu migrieren.
Es enthält einige Federkomponenten, die mir Probleme bereiten. Ich habe ein Test-Repo erstellt , um das Problem zu demonstrieren. Wenn ich die Datei module-info.java entferne, funktioniert sie einwandfrei, wie der Test in TestControllerTest.java zeigt . Wenn ich jedoch die Datei module-info.java hinzufüge, funktioniert sie mit der folgenden Ausnahme nicht mehr:
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 [email protected]/org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:643)
at [email protected]/org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:130)
at …
Die Stapelverfolgung scheint darauf hinzudeuten, dass der ApplicationContextdie @AutowiredImplementierung nicht finden kann . Ich habe das gesamte Modul zur tiefen Reflexion geöffnet. Meine höchst ungebildete Vermutung ist, dass dies mit dem Klassenpfad im Vergleich zum Modulpfad zusammenhängt, aber ich weiß nicht, was ich dagegen tun soll.
Die Datei module-info.java lautet wie folgt:
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;
}
Die folgende Befehlszeile wird von Eclipse verwendet, um den Test auszuführen (wie angefordert):
C: \ Programme \ 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: \ Benutzer \ Oscar Haglund.m2 \ repository \ org \ springframework \ security \ spring-security-web \ 5.3.2.RELEASE \ spring-security-web-5.3.2.RELEASE.jar; C: \ Benutzer \ Oscar Haglund.m2 \ Repository \ org \ springframework \ security \ spring-security- core \ 5.3.2.RELEASE \ spring-security-core-5.3.2.RELEASE.jar; C: \ Benutzer \ Oscar Haglund.m2 \ repository \ org \ springframework \ spring-bean \ 5.2.6.RELEASE \ spring- Beans-5.2.6.RELEASE.jar; C: \ Benutzer \ Oscar Haglund.m2 \ Repository \ org \ springframework \ spring-context \ 5.2.6.RELEASE \ spring-context-5.2.6.RELEASE.jar; C: \ Benutzer \ Oscar Haglund.m2 \ Repository \ org \ springframework \ spring-web \ 5.2.6.RELEASE \ spring-web-5. 2.6.RELEASE.jar; C: \ Benutzer \ Oscar Haglund.m2 \ Repository \ org \ springframework \ security \ spring-security-config \ 5.3.2.RELEASE \ spring-security-config-5.3.2.RELEASE.jar; C: \ Benutzer \ Oscar Haglund.m2 \ Repository \ org \ springframework \ spring-webmvc \ 5.2.6.RELEASE \ spring-webmvc-5.2.6.RELEASE.jar; C: \ Benutzer \ Oscar Haglund.m2 \ Repository \ javax \ servlet \ javax.servlet-api \ 3.1.0 \ javax.servlet-api-3.1.0.jar "-Klassenpfad" C: \ Benutzer \ Oscar Haglund.m2 \ Repository \ org \ springframework \ spring-jcl \ 5.2 .6.RELEASE \ spring-jcl-5.2.6.RELEASE.jar; C: \ Benutzer \ Oscar Haglund.m2 \ repository \ org \ springframework \ spring-aop \ 5.2.6.RELEASE \ spring-aop-5.2.6 .RELEASE.jar; C: \ Benutzer \ 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: \ Benutzer \ Oscar Haglund.m2 \ repository \ org \ apiguardian \ apiguardian -api \ 1.1.0 \ apiguardian-api-1.1.0.jar; C: \ Benutzer \ Oscar Haglund.m2 \ Repository \ org \ junit \ platform \ junit-platform-engine \ 1.7.0 \ junit-platform-engine-1.7.0.jar; C: \ Benutzer \ Oscar Haglund.m2 \ Repository \ org \ opentest4j \ opentest4j \ 1.2.0 \ opentest4j-1.2 .0.jar; C: \ Benutzer \ Oscar Haglund.m2 \ Repository \ org \ junit \ Plattform \ junit-Plattform-Commons \ 1.7.0 \ junit-Plattform-Commons-1.7.0.jar; C: \ Benutzer \ Oscar Haglund.m2 \ repository \ org \ junit \ jupiter \ junit-jupiter-api \ 5.7.0 \ junit-jupiter-api-5.7.0.jar; C: \ Benutzer \ Oscar Haglund.m2 \ repository \ org \ springframework \ spring-test \ 5.2.6.RELEASE \ spring-test-5.2.6.RELEASE.jar; C: \ Benutzer \ Oscar Haglund.m2 \ Repository \ org \ springframework \ restdocs \ spring-restdocs-mockmvc \ 2.0.5 .RELEASE \ spring-restdocs-mockmvc-2.0.5.RELEASE.jar; C: \ Benutzer \ Oscar Haglund.m2 \ Repository \ org \ springframework \ restdocs \ spring-restdocs-core \ 2.0.5.RELEASE \ spring-restdocs -core-2.0.5.RELEASE.jar; C: \ Benutzer \ Oscar Haglund.m2 \ Repository \ com \ schnellerxml \ jackson \ core \ jackson-database \ 2.9.5 \ jackson-database-2.9.5.jar; C. : \ Benutzer \ Oscar Haglund.m2 \ Repository \ com \ schnellerxml \ jackson \ core \ jackson-annotations \ 2.9.0 \ jackson-anno tations-2.9.0.jar; C: \ Benutzer \ Oscar Haglund.m2 \ Repository \ com \ schnellerxml \ jackson \ core \ jackson-core \ 2.9.5 \ jackson-core-2.9.5.jar; C: \ Benutzer \ Oscar Haglund.m2 \ Repository \ org \ mockito \ mockito-junit-jupiter \ 3.5.10 \ mockito-junit-jupiter-3.5.10.jar; C: \ Benutzer \ Oscar Haglund.m2 \ Repository \ org \ mockito \ mockito-core \ 3.5.10 \ mockito-core-3.5.10.jar; C: \ Benutzer \ Oscar Haglund.m2 \ Repository \ net \ bytebuddy \ byte-buddy \ 1.10.13 \ byte-buddy-1.10.13. jar; C: \ Benutzer \ Oscar Haglund.m2 \ Repository \ net \ bytebuddy \ Byte-Buddy-Agent \ 1.10.13 \ Byte-Buddy-Agent-1.10.13.jar; C: \ Benutzer \ Oscar Haglund.m2 \ Repository \ org \ objenesis \ objenesis \ 3.1 \ objenesis-3.1.jar; C: \ Benutzer \ 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 "- Patch-Modul "com.spacemetric.spring.jpmstest = C: \ dev \ source \ spring-jpms-test \ target \ test-classes" --add-liest 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.runt .jpmstest.TestControllerTest
Antworten
Zunächst einmal gab module-info.javain src/main/java, nicht in src/test/java. Außerdem habe ich es leicht geändert in:
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;
}
Dies löst sich jedoch nur "teilweise", weil:
Willkommen zu einer ziemlich groben Realität von modulesund spring(oder Tools im Allgemeinen). Schauen Sie hier, wo Menschen die gleichen Probleme haben . Die einzige praktikable Lösung, die ich gefunden habe, ist:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M5</version>
<configuration>
<useModulePath>false</useModulePath>
</configuration>
</plugin>
Dies funktioniert mit mvn clean install(und junit5), ich habe nicht genug versucht oder damit gespielt intellij, damit es funktioniert.