Я использую swagger-gradle-plugin в нескольких подпроектах, которые соответствуют различным API.В каждом подпроекте он создает документацию API с помощью Task.Resolve, а затем копирует документацию в промежуточный каталог Tomcat.Документация используется пользовательским интерфейсом Swagger, размещенным в моем веб-приложении.В проекте Gradle верхнего уровня у меня есть задача, которая зависит от этих задач.
Проект верхнего уровня:
task stageSwagger {
dependsOn { project('subproject-1').tasks.resolve }
dependsOn { project('subproject-2').tasks.resolve }
dependsOn { project('subproject-3').tasks.resolve }
}
Подпроект:
resolve {
outputFileName = "sample-openapi"
classpath = getSwaggerClasspath()
resourceClasses = getSwaggerResourceClasses()
outputPath = buildDir.toPath()
}
task swagger(type: Copy) {
dependsOn resolve
from buildDir
include 'sample-openapi.json'
into tomcatStagingDir
}
КогдаЯ запускаю task stageSwagger
из проекта верхнего уровня, я могу успешно выполнить подпроект-1: разрешить, но все последующие задачи разрешения завершаются неудачно со следующим исключением:
> Task :subproject-1:resolve
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
> Task :subproject-2:resolve FAILED
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':subproject-1:resolve'.
> org.gradle.api.GradleException (no error message)
* Try:
Run with --info or --debug option to get more log output. Run with --scan to get full insights.
* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':subproject-1:resolve'.
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:96)
...
Caused by: java.lang.reflect.InvocationTargetException
at io.swagger.v3.plugins.gradle.tasks.ResolveTask.resolve(ResolveTask.java:388)
... 49 more
Caused by: java.lang.ExceptionInInitializerError
at io.swagger.v3.jaxrs2.integration.JaxrsAnnotationScanner.classes(JaxrsAnnotationScanner.java:73)
at io.swagger.v3.jaxrs2.integration.JaxrsApplicationAndAnnotationScanner.classes(JaxrsApplicationAndAnnotationScanner.java:10)
at io.swagger.v3.oas.integration.GenericOpenApiContext.read(GenericOpenApiContext.java:469)
at io.swagger.v3.jaxrs2.integration.SwaggerLoader.resolve(SwaggerLoader.java:215)
... 50 more
Caused by: java.lang.ClassCastException: com.sample.MyLogger cannot be cast to com.sample.MyLogger
at com.sample.MyLogger.getLogger(MyLogger.java:61)
at com.sample.MyClient.<clinit>(MyClient.java:64)
... 54 more
Я предполагаю, что вышеупомянутое исключениеэтот com.sample.MyLogger загружается загрузчиком классов, но когда классы преобразуются, он использует com.sample.MyLogger из другого загрузчика классов, поэтому возникает исключение ClassCastException, даже если это тот же класс.
MyLogger.javaрасширен от java.util.logging.Logger.Экземпляр MyLogger создается LogManager.Поскольку LogManager может возвращать только экземпляр Logger, я должен привести MyLogger к объекту Logger, чтобы классы, которые его используют, могли обращаться к методам в MyLogger.
public static MyLogger getLogger() {
synchronized (Logger.class) {
// Calling class is always at index 1
String className = new Exception().getStackTrace()[1].getClassName();
return (MyLogger) getLogger(className);
}
}
public static Logger getLogger(String name) {
synchronized (Logger.class) {
LogManager manager = LogManager.getLogManager();
Logger result = manager.getLogger(name);
if (result == null) {
result = new MyLogger(name);
manager.addLogger(result);
return manager.getLogger(name);
}
return result;
}
}
Мой вопрос:
Это ошибка в swagger-gradle-plugin, что он пытается привести класс из другого загрузчика классов?
ИЛИ
Есть ли другой способ настроить проект gradle так, чтобыодин и тот же загрузчик классов используется в разных подпроектах?