Gradle子项目排序并生成jar(spring boot + angular)

时间:2018-01-22 12:12:45

标签: spring-boot gradle build.gradle gradle-plugin

我是Gradle newby。我有以下项目设置:

  • core:包含spring boot 2 application
  • ui:angular 5前端应用程序

目标:我想从我的根文件夹运行'gradle build',它应该包含一个包含Angular应用程序的jar文件。

我得到了'ui'覆盖:

apply plugin: "com.moowork.node"

    buildscript {
        repositories globalRepositories
        dependencies {


       classpath "com.moowork.gradle:gradle-node-plugin:1.2.0"
    }
}

node {
    // based on current version of Angular 5
    version = "8.9.1"
    npmVersion = "5.6.0"
    download = true
}

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

buildAngular.dependsOn(npm_install)
build.dependsOn(buildAngular)

上面的gradle定义将在静态后端核心应用程序中构建并生成Angular文件。

'core'gradle构建文件看起来像这样(我排除了依赖项),没什么特别的:

apply plugin: 'java'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

group = 'xxx.xxxxxx'
version = '0.0.1-SNAPSHOT'

sourceCompatibility = 1.8
targetCompatibility = 1.8

buildscript {
    repositories globalRepositories
    ext {
        springBootVersion = '2.0.0.M7'
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

jar {
    baseName = 'spring-boot-angular'
    version = '1.0.0'
}

我怎样才能做到这一点?我希望从我的根项目运行'gradle build'时触发以下操作:

  1. 在ui
  2. 中首先运行'gradle build'
  3. 然后在核心
  4. 中第二次运行'gradle build'
  5. 使用'core'生成的jar文件作为最终结果
  6. 我无法忍受groovy这样的语法,不能等待Gradle Kotlin DSL成熟:P

    希望有人可以提供帮助。当我准备好并准备好时,我将开源这个设置(与Spring 5,Hibernate 5和flyway一起)。提前谢谢。

2 个答案:

答案 0 :(得分:3)

您需要在后端(核心)构建中生成的jar中包含前端(ui)buildAngular任务的结果:

bootJar {
  dependsOn ':ui:buildAngular'

  into('BOOT-INF/classes/static') {
    from "${project(':ui').projectDir}/dist"
  }
}

bootJar任务现在依赖于前端的buildAngular任务这一事实将使gradle根据需要对它们进行排序。

您可以使用基本相同的设置浏览this project of mine以获得示例(除了使用yarn而不是npm来解析依赖关系)

答案 1 :(得分:0)

JB Nizet的答案应该有效。您还可以在根gradle文件中添加以下内容:

build.dependsOn("core:build").mustRunAfter("ui:build")

以上答案在我看来更干净。

相关问题