类 使用 kongchen swagger-maven-plugin 时 gradle task swagger 不可见
classes not visible to gradle task swagger when using kongchen swagger-maven-plugin
执行 gradle clean 然后 gradle swagger 时抛出 ClassNotFoundException。如果 gradle swagger 再次 运行(基本上在之前的 运行 中完成 api 构建之后),它工作正常。
build.gradle 如下所示:
buildscript {
repositories {
maven { url hydraMavenRepo }
maven { url hydraPluginsRepo }
}
dependencies {
classpath "com.github.kongchen:swagger-maven-plugin:3.1.4"
}
}
apply plugin: 'java'
configurations {
addclasspath
}
dependencies {
addclasspath files(project(':api:desktop-api').configurations['runtime'].files)
addclasspath files(project(':api:desktop-api').sourceSets['main'].output)
addclasspath files(project(':api:desktop-api').sourceSets.main.output.classesDir)
runtime project(':api:desktop-api')
}
sourceSets {
main {
runtimeClasspath += files(project(':api:desktop-api').sourceSets['main'].output)
runtimeClasspath += files(project(':api:desktop-api').sourceSets['main'].output.classesDir)
runtimeClasspath += files(project(':api:desktop-api').configurations['runtime'].files)
}
}
import com.github.kongchen.swagger.docgen.mavenplugin.ApiDocumentMojo
import com.github.kongchen.swagger.docgen.mavenplugin.ApiSource
import io.swagger.models.Info
task swagger(dependsOn: [':api:desktop-api:build']) {
doLast {
logger.info 'Swagger GenDoc...'
project.file(reportsDir).mkdirs()
// a trick to have all needed classes in the classpath
def customClassLoader = new GroovyClassLoader()
buildscript.configurations.classpath.each {
//println it.toURI().toURL()
customClassLoader.addURL(it.toURI().toURL())
}
configurations.addclasspath.each {
customClassLoader.addURL(it.toURI().toURL())
}
// the same settings as in the swagger-maven-example/pom.xml
final ApiDocumentMojo mavenTask = Class.forName('com.github.kongchen.swagger.docgen.mavenplugin.ApiDocumentMojo', true, customClassLoader).newInstance(
apiSources: [
new ApiSource(
springmvc: false,
locations: ['com/vmware/vdi/hydra'],
schemes: ['http', 'https'],
host: 'vmware.com',
basePath: '/api',
info: new Info(
title: "Hydra DS-REST API's",
version: 'v100',
description: "Hydra DS-REST API's",
),
swaggerDirectory: reportsDir
)
]
)
mavenTask.execute()
logger.info 'Swagger GenDoc task is completed'
}
}
你的构建脚本有几个缺陷。
您不应依赖构建脚本依赖项中的构建内容。这是母鸡和鸡蛋的问题。您需要执行构建以获取执行构建所需的 类。这根本无法可靠地工作。
相反,您应该将它们声明为 buildscript
块之外的依赖项。 buildscript
块仅用于构建脚本对 运行 本身所需的依赖项,例如 Gradle 任务和 Gradle 插件或 类 您在构建,就像在 buildscript
块中正确的 swagger-maven-plugin
东西。
除此之外,您在配置阶段而不是在执行阶段执行部分 swagger 内容(实例化、执行和打印)。你在任务关闭中所做的一切,但在任何 doFirst
或 doLast
块之外,在配置阶段都是 运行,当构建被配置时,因此总是,无论你真正想要什么任务执行,而不管任务是否已经是最新的。为了使最新检查工作并节省您的时间,您需要声明所有输入,例如可能在执行和您生成的所有输出之间发生变化的文件和属性,然后 Gradle 可以发挥其魔力,只执行在实际需要时执行任务。
此外,您不应在构建脚本中使用 println
。这就像在 Java 程序中使用 System.out.println
。相反,您应该直接使用提供的日志记录工具,例如。 G。做 logger.info 'Swagger GenDoc task is completed'
.
buildscript.classloader 正是我要找的。
下面是有效的代码:
buildscript {
repositories {
maven { url mavenRepo }
}
dependencies {
classpath "com.github.kongchen:swagger-maven-plugin:3.1.4"
}
}
import com.github.kongchen.swagger.docgen.mavenplugin.ApiDocumentMojo
import com.github.kongchen.swagger.docgen.mavenplugin.ApiSource
import io.swagger.models.Info
task swagger(dependsOn: ':api:build') {
doLast {
logger.info 'Swagger GenDoc...'
project.file(<dir>).mkdirs()
FileCollection apiRuntimeFiles = files(project(':api').configurations['runtime'].files)
apiRuntimeFiles.each {
buildscript.classLoader.addURL(it.toURI().toURL())
}
FileCollection apiClassFiles =files(project(':api').sourceSets['main'].output)
apiClassFiles.each {
buildscript.classLoader.addURL(it.toURI().toURL())
}
final ApiDocumentMojo mavenTask = Class.forName('com.github.kongchen.swagger.docgen.mavenplugin.ApiDocumentMojo', true, buildscript.classLoader).newInstance(
apiSources: [
new ApiSource(
springmvc: false,
locations: ['<loc>'],
schemes: ['http', 'https'],
host: '<host>',
basePath: '/api',
info: new Info(
title: "REST API's",
version: 'v1',
description: "REST API's",
),
swaggerDirectory: <dir>
)
]
)
mavenTask.execute()
logger.info 'Swagger GenDoc task is completed'
}
}
执行 gradle clean 然后 gradle swagger 时抛出 ClassNotFoundException。如果 gradle swagger 再次 运行(基本上在之前的 运行 中完成 api 构建之后),它工作正常。
build.gradle 如下所示:
buildscript {
repositories {
maven { url hydraMavenRepo }
maven { url hydraPluginsRepo }
}
dependencies {
classpath "com.github.kongchen:swagger-maven-plugin:3.1.4"
}
}
apply plugin: 'java'
configurations {
addclasspath
}
dependencies {
addclasspath files(project(':api:desktop-api').configurations['runtime'].files)
addclasspath files(project(':api:desktop-api').sourceSets['main'].output)
addclasspath files(project(':api:desktop-api').sourceSets.main.output.classesDir)
runtime project(':api:desktop-api')
}
sourceSets {
main {
runtimeClasspath += files(project(':api:desktop-api').sourceSets['main'].output)
runtimeClasspath += files(project(':api:desktop-api').sourceSets['main'].output.classesDir)
runtimeClasspath += files(project(':api:desktop-api').configurations['runtime'].files)
}
}
import com.github.kongchen.swagger.docgen.mavenplugin.ApiDocumentMojo
import com.github.kongchen.swagger.docgen.mavenplugin.ApiSource
import io.swagger.models.Info
task swagger(dependsOn: [':api:desktop-api:build']) {
doLast {
logger.info 'Swagger GenDoc...'
project.file(reportsDir).mkdirs()
// a trick to have all needed classes in the classpath
def customClassLoader = new GroovyClassLoader()
buildscript.configurations.classpath.each {
//println it.toURI().toURL()
customClassLoader.addURL(it.toURI().toURL())
}
configurations.addclasspath.each {
customClassLoader.addURL(it.toURI().toURL())
}
// the same settings as in the swagger-maven-example/pom.xml
final ApiDocumentMojo mavenTask = Class.forName('com.github.kongchen.swagger.docgen.mavenplugin.ApiDocumentMojo', true, customClassLoader).newInstance(
apiSources: [
new ApiSource(
springmvc: false,
locations: ['com/vmware/vdi/hydra'],
schemes: ['http', 'https'],
host: 'vmware.com',
basePath: '/api',
info: new Info(
title: "Hydra DS-REST API's",
version: 'v100',
description: "Hydra DS-REST API's",
),
swaggerDirectory: reportsDir
)
]
)
mavenTask.execute()
logger.info 'Swagger GenDoc task is completed'
}
}
你的构建脚本有几个缺陷。
您不应依赖构建脚本依赖项中的构建内容。这是母鸡和鸡蛋的问题。您需要执行构建以获取执行构建所需的 类。这根本无法可靠地工作。
相反,您应该将它们声明为 buildscript
块之外的依赖项。 buildscript
块仅用于构建脚本对 运行 本身所需的依赖项,例如 Gradle 任务和 Gradle 插件或 类 您在构建,就像在 buildscript
块中正确的 swagger-maven-plugin
东西。
除此之外,您在配置阶段而不是在执行阶段执行部分 swagger 内容(实例化、执行和打印)。你在任务关闭中所做的一切,但在任何 doFirst
或 doLast
块之外,在配置阶段都是 运行,当构建被配置时,因此总是,无论你真正想要什么任务执行,而不管任务是否已经是最新的。为了使最新检查工作并节省您的时间,您需要声明所有输入,例如可能在执行和您生成的所有输出之间发生变化的文件和属性,然后 Gradle 可以发挥其魔力,只执行在实际需要时执行任务。
此外,您不应在构建脚本中使用 println
。这就像在 Java 程序中使用 System.out.println
。相反,您应该直接使用提供的日志记录工具,例如。 G。做 logger.info 'Swagger GenDoc task is completed'
.
buildscript.classloader 正是我要找的。
下面是有效的代码:
buildscript {
repositories {
maven { url mavenRepo }
}
dependencies {
classpath "com.github.kongchen:swagger-maven-plugin:3.1.4"
}
}
import com.github.kongchen.swagger.docgen.mavenplugin.ApiDocumentMojo
import com.github.kongchen.swagger.docgen.mavenplugin.ApiSource
import io.swagger.models.Info
task swagger(dependsOn: ':api:build') {
doLast {
logger.info 'Swagger GenDoc...'
project.file(<dir>).mkdirs()
FileCollection apiRuntimeFiles = files(project(':api').configurations['runtime'].files)
apiRuntimeFiles.each {
buildscript.classLoader.addURL(it.toURI().toURL())
}
FileCollection apiClassFiles =files(project(':api').sourceSets['main'].output)
apiClassFiles.each {
buildscript.classLoader.addURL(it.toURI().toURL())
}
final ApiDocumentMojo mavenTask = Class.forName('com.github.kongchen.swagger.docgen.mavenplugin.ApiDocumentMojo', true, buildscript.classLoader).newInstance(
apiSources: [
new ApiSource(
springmvc: false,
locations: ['<loc>'],
schemes: ['http', 'https'],
host: '<host>',
basePath: '/api',
info: new Info(
title: "REST API's",
version: 'v1',
description: "REST API's",
),
swaggerDirectory: <dir>
)
]
)
mavenTask.execute()
logger.info 'Swagger GenDoc task is completed'
}
}