multi-module Gradle project: webjar doesn't get placed in "META-INF/resources"

Viewed 269

I am trying to combine a Spring Boot backend api and a React frontend app into one single jar. I was able to build a jar file containing both by following this article (https://medium.com/xebia-engineering/a-minimalistic-guide-to-building-and-deploying-monolithic-spring-boot-react-applications-39440035b27) but the frontend jar ends up in BOOT-INF/lib/frontend.jar instead of META-INF/resources. How can I create a jar file with the webjar in the right directory so it can render a React page?

Project Structure

frontend/build.gradle

plugins {
    id "com.moowork.node" version "1.3.1"
}
apply plugin: "java"
apply plugin: "com.moowork.node"

node {
    version = "12.9.1"
    download = true
}
task bundle(type: NpmTask, dependsOn: npmInstall) {
    args = ["run", "build"]
}
task uiTest(type: NpmTask) {
    environment = ["CI": "true"]
    args = ["run", "test"]
}
task run(type: NpmTask) {
    args = ["start"]
}

check.dependsOn(test)
jar.dependsOn(bundle)

task webjar(type: Jar) {
    from(fileTree("build")) {
        into "META-INF/resources"
    }
}

check.dependsOn(test)
jar.dependsOn(bundle)
jar.finalizedBy("webjar")

backend/build.gradle

plugins {
    id 'org.springframework.boot' version '2.1.5.RELEASE'
    id 'java'
}

apply plugin: 'io.spring.dependency-management'
apply plugin: 'maven'

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
    mavenCentral()
    maven {
        url 'https://repo.spring.io/libs-milestone'
    }
}


jar {
    manifest {
        attributes "Main-Class": "com.example.kasahararestapi.StockCheckAppApplication"
    }

    from {
        configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
    }
}


tasks.withType(Test) {
    scanForTestClasses = false
    include "**/*Test.class" // whatever Ant pattern matches your test class files
}


dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-security'
    runtimeOnly 'org.springframework.boot:spring-boot-devtools'
    runtimeOnly 'mysql:mysql-connector-java'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    implementation 'org.springframework.social:spring-social-github:1.0.0.M4'
    implementation 'commons-io:commons-io:2.6'
    implementation 'org.apache.commons:commons-lang3:3.0'
    implementation 'io.jsonwebtoken:jjwt:0.9.0'
    implementation platform('com.amazonaws:aws-java-sdk-bom:1.11.807')
    implementation 'com.amazonaws:aws-java-sdk-s3'
    implementation 'org.springframework.boot:spring-boot-starter-mail:1.2.0.RELEASE'
    implementation 'org.modelmapper:modelmapper:2.3.5'
    testCompile group: 'junit', name: 'junit', version: '4.11'
    implementation project(path: ':frontend', configuration: 'default')

}

setting.gradle

pluginManagement {
    repositories {
        gradlePluginPortal()
    }
}
rootProject.name = 'stock_check_app'
include 'backend'
include 'frontend'

0 Answers
Related