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

Posted

技术标签:

【中文标题】Gradle 子项目排序并生成 jar (spring boot + angular)【英文标题】:Gradle subproject ordering and generate jar (spring boot + angular) 【发布时间】:2018-07-01 01:41:28 【问题描述】:

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

核心:包含 Spring Boot 2 应用程序 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”时,我希望触发以下操作:

    在 ui 中运行第一个“gradle build” 然后在核心中第二次运行“gradle build” 使用“core”生成的 jar 文件作为最终结果

我受不了这种 groovy 的语法,等不及 Gradle Kotlin DSL 成熟了:P

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

【问题讨论】:

【参考方案1】:

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

bootJar 
  dependsOn ':ui:buildAngular'

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

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

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

【讨论】:

【参考方案2】:

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

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

在我看来,以上答案更简洁。

【讨论】:

以上是关于Gradle 子项目排序并生成 jar (spring boot + angular)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 gradle 构建源 jar?

gradle生成的eclipse的web项目,在发布后,缺少jar包的情况。

运行 gradle 生成的 jar 找不到 jar 条目

如何使用 spring boot 插件 2.0.x 从一个具有不同依赖项的 gradle 项目生成 2 个 jars

升级到 Gradle 5.2.1 不会生成 *-all.jar

更新 Spring Boot 以生成 WAR 文件而不是 JAR 文件