簡體   English   中英

切換到 JPMS(Java 平台模塊系統)時出現 Spring NoSuchBeanDefinitionException

[英]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;

}

但無論如何,這只能“部分”解決,因為:

歡迎來到modulesspring (或一般工具)的相當粗糙的現實。 看看這里,人們有同樣的問題 我找到的唯一可行的解​​決方案是:

<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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM