首页 > 解决方案 > Gradle 不会将 html 文件复制到执行的 jar 中

问题描述

构建.gradle

buildscript {
    ext {
        springBootVersion = '2.0.6.RELEASE'
        springRestDocsVersion = '2.0.2.RELEASE'
        gradleDockerVersion   = '1.2'
        asciidoctorGradlePluginVersion   = '1.5.9.2'
    }
    repositories {
        mavenCentral()
        jcenter()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
        classpath("org.asciidoctor:asciidoctor-gradle-plugin:${asciidoctorGradlePluginVersion}")
        classpath("se.transmode.gradle:gradle-docker:${gradleDockerVersion}")
    }
}

plugins {
  id "org.springframework.boot" version "2.0.6.RELEASE"
  id "org.asciidoctor.convert" version "1.5.9.2"
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'maven'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'org.asciidoctor.convert'
apply plugin: 'application'
apply plugin: 'docker'

apply from: 'local.gradle'

mainClassName = 'class.path.package.BootApplication'

version = '0.0.3a'
sourceCompatibility = 1.8
targetCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    // Standard spring boot packages
    compile('org.springframework.boot:spring-boot-starter-web')
    compile('org.springframework.cloud:spring-cloud-starter-config')
    compile('org.springframework.boot:spring-boot-starter-jersey')
    compile('org.springframework.boot:spring-boot-starter-security')
    compile('org.springframework.boot:spring-boot-starter-validation')
    compile('org.springframework.boot:spring-boot-starter-data-jpa')

    compile('org.springframework.cloud:spring-cloud-starter-netflix-eureka-client')

    compile('org.postgresql:postgresql')
    compile('biz.paluch.redis:lettuce:4.4.6.Final')
    compile('org.pacesys:openstack4j-core:3.1.0')
    compile('org.pacesys.openstack4j.connectors:openstack4j-httpclient:3.1.0')

    // Dozer object mapping
    compile('net.sf.dozer:dozer:5.5.1')
    // Sengrid library
    compile('com.sendgrid:sendgrid-java:4.2.1')
    compile('org.freemarker:freemarker:2.3.28')
    // Cloudant
    compile('com.cloudant:cloudant-client:2.9.0')
    compile('com.squareup.okhttp3:okhttp-urlconnection:3.4.2')
    compile('org.json:json:20171018')
    compile('javax.validation:validation-api:2.0.1.Final')
    //Swagger2
    compile('io.springfox:springfox-swagger2:2.9.2')
    compile('io.springfox:springfox-swagger-ui:2.9.2')

    runtime('org.springframework.boot:spring-boot-devtools')

    testCompile('org.springframework.boot:spring-boot-starter-test')
    testCompile('org.springframework.security:spring-security-test')
    testCompile("org.springframework.restdocs:spring-restdocs-mockmvc")
    testCompile("org.asciidoctor:asciidoctor-gradle-plugin:1.5.9.2")

    asciidoctor('org.springframework.restdocs:spring-restdocs-asciidoctor:2.0.2.RELEASE')

}

processResources {
//    expand(project.properties)
}

ext {
    springCloudVersion = 'Finchley.RELEASE'
    snippetsDir = file('build/generated-snippets')
//  springRestDocsVersion = '2.0.2.RELEASE'
}

ext['spring-restdocs.version'] = '${springRestDocsVersion}'

test { 
    outputs.dir snippetsDir
}

dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
        mavenBom("org.springframework.boot:spring-boot-dependencies:${springBootVersion}")
    }
}

asciidoctor {
//    attributes "snippets": snippetsDir
    inputs.dir snippetsDir
    dependsOn test
}

jar {
    dependsOn asciidoctor 
    from ('${asciidoctor.outputDir}/html5') { 
        into 'static/apidocs'
    }
}

我的问题实际上在这部分:

jar {
    dependsOn asciidoctor 
    from ('${asciidoctor.outputDir}/html5') { 
        into 'static/apidocs'
    }
}

执行的 jar 不会将从 asciidoctor 执行的 index.html 文件复制到 jar 和仅在没有此文件的情况下执行的 jar

那么我如何将build/asciidoc/html5/index.html从 build 文件夹复制到执行的 jar 中?

另外,如果我需要使用 bootJar 任务,那么我如何使它包含所有需要的 jar 到/BOOT-INF/lib/

标签: spring-bootgradlebuild.gradle

解决方案


您的配置几乎是正确的,但您正在自定义错误的任务。Spring Boot fat jar 是使用bootJar任务而不是jar任务构建的。你需要在你jar的. 这将导致它看起来与以下示例相同:bootJarbuild.gradle

bootJar {
    dependsOn asciidoctor 
    from ("${asciidoctor.outputDir}/html5") { 
        into 'static/docs'
    }
}

这是REST Docs 文档中描述的配置。


推荐阅读