web-dev-qa-db-ja.com

Spring BootでGradleビルドを使用して静的ファイルをjarに追加する方法+ Angular 2プロジェクト

Spring Boot + Angular 2プロジェクトです。Herokuにデプロイしたいのですが、npmビルドを実行して、生成されたファイルをパブリックフォルダー(src/resources/public)を手動で実行してから、バックエンドビルドを実行します。これを行うには、一度にすべてを実行するGradleビルドを設定します。これまでのところ、フロントエンドをビルドするGradleビルドを作成します。バックエンド、ただしjarを生成する前に静的ファイルをコピーしないjarには上記の静的ファイルが含まれていないため、Herokuでは動作しません。

プロジェクトのフォルダー構造は次のとおりです。

root
 backend
  src/main/Java
  src/main/resources
 frontend
  --> angular files go here
 build/libs -> where the JAR file goes

Gradleビルドファイル:

buildscript {
repositories {
    mavenCentral()
}
dependencies {
    // spring
    classpath('org.springframework.boot:spring-boot-gradle-plugin:1.5.2.RELEASE')
    classpath('org.springframework:springloaded:1.2.6.RELEASE')
    }
}

plugins {
    id "com.moowork.node" version "1.2.0"
}

// gradle wrapper
task wrapper(type: Wrapper) {
    gradleVersion = '3.4'
}

// configure gradle-node-plugin
node {
    version = '8.1.4'
    npmVersion = '5.0.3'
    download = true
    workDir = file("${project.projectDir}/node")
    nodeModulesDir = file("${project.projectDir}/")
}

// clean node/node_modules/dist
task npmClean(type: Delete) {
    final def webDir = "${rootDir}/frontend"
    delete "${webDir}/node"
    delete "${webDir}/node_modules"
    delete "${webDir}/dist"
    delete "${webDir}/coverage"
    delete "${rootDir}/backend/src/main/resources/public"
}

// clean task for npm

task copyFiles {
    doLast {
        copy {
            from "${rootDir}/frontend/dist"
            into "${rootDir}/backend/src/main/resources/public"
        }
    }    
}

// build task for npm
task frontendBuild {}
frontendBuild.dependsOn(npm_install)
frontendBuild.dependsOn(npm_run_build)

npm_install {
  args = ['--prefix', './frontend']
}

npm_run_build {
  args = ['--prefix', './frontend']
}

apply plugin: 'Java'
apply plugin: 'Eclipse'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'

sourceSets {
    main {
        Java {
            srcDirs = ['backend/src/main/Java']
        }
        resources {
            srcDirs = ['backend/src/main/resources']
        }
    }
}

copyFiles.dependsOn(frontendBuild);
compileJava.dependsOn(frontendBuild);

task backendBuild {}
backendBuild.dependsOn(compileJava)
backendBuild.dependsOn(jar)

jar.dependsOn(copyFiles)

repositories {
    mavenCentral()
}

Eclipse {
    classpath {
         containers.remove('org.Eclipse.jdt.launching.JRE_CONTAINER')
         containers('org.Eclipse.jdt.launching.JRE_CONTAINER/org.Eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8')
    }
}

idea {
    module {
        inheritOutputDirs = false
        outputDir = file("${buildDir}/classes/main/")
    }
}

jar {
    baseName = 'expense-splitter'
    version = '0.0.1'
}

sourceCompatibility = 1.8
targetCompatibility = 1.8

configurations {
    dev
}

dependencies {
    // spring
    compile('org.springframework.boot:spring-boot-starter-web:1.5.2.RELEASE')
    compile('org.springframework.boot:spring-boot-starter-data-jpa:1.5.2.RELEASE')
    compile('org.springframework.boot:spring-boot-starter-security:1.5.2.RELEASE')

    compile('org.Apache.commons:commons-lang3:3.3.2')

    // to make hibernate handle Java 8 date and time types correctly
    // it's marked as deprecated but we need to keep it until
    // spring boot jpa starts using hibernate 5.2
    compile('org.hibernate:hibernate-Java8:5.1.0.Final')

    // json web tokens
    compile ('io.jsonwebtoken:jjwt:0.7.0')

    compile 'mysql:mysql-connector-Java'
    // google gson
    compile('com.google.code.gson:gson:2.8.0')
    // jackson - parsing of Java 8 date and time types
    compile('com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.8.7')


    // spring dev tools
    dev('org.springframework.boot:spring-boot-devtools:1.5.2.RELEASE')

    // testing
    testCompile('org.springframework.boot:spring-boot-starter-test:1.5.2.RELEASE')
}

// run spring boot app
bootRun {
    //addResources = true
    classpath = sourceSets.main.runtimeClasspath + configurations.dev
    jvmArgs = ["-Xdebug -agentlib:jdwp=transport=dt_socket,address=8080,server=y,suspend=n"]
}

// run all task
task runAll {}
runAll.dependsOn(bootRun)

前もって感謝します、

8
fpezzini

別のアプローチを試してください。リソースを手動でコピーする代わりに、GradleにJARのリソースを処理するときに、frontend/dist/の内容も考慮に入れることを伝えます。

processResources {
    from ('frontend/dist/') {
        into 'public'
    }
}

これにより、public/ディレクトリを含むJARになり、その中にfrontend/dist/のコンテンツが含まれます。

21
nickb

Spring Boot 1.5\2.xのGradle構成+ + Angular 2-6

サブフォルダーの角度frontend

フロントエンドモジュール

クレートbuild.gradle

plugins {
  id "com.moowork.node" version "1.2.0"
}

node {
  version = '8.11.3'
  npmVersion = '5.6.0'
  download = true
  workDir = file("${project.buildDir}/node")
  nodeModulesDir = file("${project.projectDir}")
}

task build(type: NpmTask) {
  args = ['run', 'build']
}

build.dependsOn(npm_install)

Angular 6)に関する注記

angular.jsonoutputPath値を「dist」に更新

バックエンドモジュール

バックエンドモジュールのbuild.gradleを編集します。

Spring Boot 2.X:

bootJar {
    archiveName = "yourapp.jar"
    mainClassName = 'com.company.app.Application'

    from('frontend/dist') {
        into 'static'
    }
}

Spring Boot 1.5.X:

jar {
    archiveName = "yourapp.jar"
    manifest {
        attributes 'Main-Class': 'com.company.app.Application'
    }
    from('frontend/dist') {
        into 'static'
    }
    from {
        configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
    }
}

最後にbootRepackageまたはbootJarタスクを実行し、builds/libsで結果を確認します

4
Evgeny Lebedev

フロントエンドが次のフォルダーにあるとします:src/main/webapp/fe-ui/、Spring Bootバージョン2.1.1.RELEASEの次のソリューションを検討できます。

bootJar {
    baseName = 'jar-name'
    version = '0.1.0'
    from('src/main/webapp/fe-ui/build') {
        into 'public'
    }
}

task installFeDependencies(type: NpmTask) {
    args = ['install']
}

task buildFe(type: NpmTask) {
    args = ['run', 'build']
    dependsOn installFeDependencies
}

compileJava {
    dependsOn buildFe
}

ランニング gradlew buildは、フロントエンドのインストール、ビルド、およびbootJarの呼び出しを行います。後者はビルドされたフロントエンドバンドルをパッケージ化します。

0
mr.M