问题描述
我使用Spring Rest Docs和jib
当我执行./gradlew build
和java -jar /some/build/libs/app.jar
时。我可以在example.com/docs/asciidocname.html
上获得Spring Rest文档生成的api文档。
但是带有./gradlew jib
的docker镜像不包含该URL。
我要获取./gradlew jib
时由Spring Rest Docs生成的api文档
以下是我的build.gradle
plugins {
id "org.asciidoctor.convert" version "2.4.0"
id "com.google.cloud.tools.jib" version "2.5.0"
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
querydsl.extendsFrom compileClasspath
asciidoctor
}
repositories {
mavenCentral()
maven { url 'https://repo.spring.io/milestone' }
maven { url 'https://repo.spring.io/snapshot' }
}
sourceCompatibility = '11'
dependencies {
/**
* RestDocs
*/
asciidoctor 'org.springframework.restdocs:spring-restdocs-asciidoctor'
testImplementation('org.springframework.restdocs:spring-restdocs-mockmvc')
}
test {
useJUnitPlatform {
includeEngines 'junit-jupiter'
}
}
/*************************
* Rest Docs
*************************/
asciidoctor {
dependsOn test
}
bootJar {
dependsOn asciidoctor
from ("${asciidoctor.outputDir}/html5") {
into 'static/docs'
}
}
解决方法
您已将bootJar
任务配置为依赖于asciidoctor
任务并包括生成的HTML文件:
bootJar {
dependsOn asciidoctor
from ("${asciidoctor.outputDir}/html5") {
into 'static/docs'
}
}
Jib在构建容器映像时不使用jar文件,因此您需要向Jib添加类似的配置。
让我们首先让它包含生成的HTML。它提供了一个名为jib
的扩展名,您可以在其中使用extraDirectories
进行扩展:
jib {
extraDirectories {
paths {
path {
from = "${asciidoctor.outputDir}/html5"
into = "/app/resources/static/docs"
}
}
}
}
您可以了解更多有关在the documentation for its Gradle plugin中将文件添加到Jib生成的图像中的信息。
现在,我们需要将jib
任务配置为依赖于asciidoctor
任务。这样可确保在Jib尝试将HTML包含在图像中之前已生成HTML。由于扩展名和任务都命名为jib
,因此我们需要显式引用任务:
tasks.named('jib') {
dependsOn asciidoctor
}
如果您曾经将映像构建到本地Docker守护程序,则可能还需要对jibDockerBuild
任务进行类似的配置:
jibDockerBuild {
dependsOn asciidoctor
}
,
然后我找到了另一种方式。
第一。 JIB通过java -cp
命令执行一个主要的Java类。未打包的.jar
文件。
和asciidoctor任务将html文件复制到jar文件中。
我可以在臂架gradle github上找到选项。
- 如果您使用
containerizingMode = 'packaged'
选项。它将构建jar文件并在Docker容器中执行java -cp
命令。 - 和具有此选项的
./gradlew jib
任务将执行jar
任务。
因此,我将bootJar任务复制到jar任务并使用该选项。效果很好