Я начинаю некоторые обновления нашей инфраструктуры, обновляя некоторые библиотеки для использования Gradle 5.1 (с 4.2), Spring Boot 2 (с 1.5), Java 11 (с 8), а затем с целью использования Java 11модульная система.
Я сделал все обновления, а затем мои тесты не пройдены на последнем этапе.Похоже, что когда я инструктирую Gradle запускать тесты, используя путь к модулю, Spring не забирает мои объекты @Component, и моя автопроводка завершается неудачей.
Чтобы было ясно, тесты проходят при использовании Java 11 ипуть к классу по умолчанию, но не удается, когда я добавляю задачи compileTestJava
и test
, показанные ниже.(Эти задачи были основаны на примере из gradle.org java 9 guide ). Код все еще компилируется (я преодолел все ошибки сборки, связанные с модулем), и контекст Spring пытается встать, когдаЯ получаю сообщение об ошибке ниже.
Когда я использую Spring для включения репозиториев JPA, он находит эти классы (в разных пакетах одного и того же проекта) и создает из них одноэлементные компоненты, как и ожидалось.Но когда я запускаю тест для сервиса, которому нужен экземпляр сервиса, который он тестирует, он не создает этот компонент.
Поэтому очевидный вопрос заключается в том, почему мой тест больше не может найти эти классы для создания.?
build.gradle (обрезано)
plugins {
id 'java'
id 'com.gradle.build-scan' version "2.1"
id 'org.springframework.boot' version "2.1.2.RELEASE"
id 'maven-publish'
}
//sourceCompatibility = '1.8'
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'
if (!hasProperty('mainClass')) {
ext.mainClass = ''
}
jar {
enabled = true
baseName = "my-jar"
// For embedded tomcat apps
manifest.attributes provider: 'gradle'
}
compileJava {
inputs.property("moduleName", "com.mypackage.academics")
doFirst {
options.compilerArgs = [
'--module-path', classpath.asPath,
]
classpath = files()
}
}
compileTestJava {
inputs.property("moduleName", "com.mypackage.academics")
doFirst {
options.compilerArgs = [
'--module-path', classpath.asPath,
'--add-modules', 'junit',
'--add-reads', "com.mypackage.academics=junit",
'--patch-module', "com.mypackage.academics=" + "src/test/resources:" + files(sourceSets.test.java.srcDirs).asPath,
]
classpath = files()
}
}
test {
inputs.property("moduleName", "com.mypackage.academics")
doFirst {
jvmArgs = [
'--module-path', classpath.asPath,
'--add-modules', 'ALL-MODULE-PATH',
'--add-reads', "com.mypackage.academics=junit,spring.test,org.hamcrest",
'--patch-module', "com.mypackage.academics=" + "src/test/resources:" + files(sourceSets.test.java.outputDir).asPath,
]
classpath = files()
}
}
module-info.java (обрезано)
module com.mypackage.academics {
exports com.mypackage.academics.config;
opens com.mypackage.academics.config to org.hibernate.orm.core, spring.core;
requires spring.beans;
requires spring.data.commons;
requires spring.context;
requires spring.core;
requires spring.data.jpa;
requires spring.tx;
}
Ошибка:
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.mypackage.academics.config.AcademicsConfigService' 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.1.4.RELEASE/org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1651)
at spring.beans@5.1.4.RELEASE/org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1210)
at spring.beans@5.1.4.RELEASE/org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1164)
at spring.beans@5.1.4.RELEASE/org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:593)
... 52 more