首页 > 解决方案 > 如何在考虑相对路径的情况下使用多项目设置 settings.gradle 和 build.gradle

问题描述

我制作了一个类似目录的java多项目,如下所示

myRoot
┝ settings.gradle
┝ build.gradle
┗ core
┗ ┗━ web
└ └ ── build.gradle
└ └ ── src
┗ ┗━ corecommon
└ └ ── build.gradle
└ └ ── src
┗ ┗━ frame
└ ─ ── build.gradle
└ ─ ── src
┗ biz
┗ ┗━ model
└ ─ ── build.gradle
└ ─ ── src
┗ ┗━ bizcommon
└ ─ ── build.gradle
└ ─ ── src

为了包含我的多项目,我写了一个settings.gradle如下的根目录。

rootProject.name = 'myRoot'

rootDir.eachDir { dir ->
    if(dir.name.startsWith('core')){
        dir.eachDir {eachDir ->
            include eachDir.name
            project(":${eachDir.name}").projectDir = eachDir
        }
    }

    if(dir.name.startsWith('biz')){
        dir.eachDir {eachDir ->
            include eachDir.name
            project(":${eachDir.name}").projectDir = eachDir
        }
    }
}

这是我build.gradle的根目录的总结版本。

buildscript {
    ...
}

allprojects {
    group 'com.myRoot'
    version '0.1.1'

    repositories {
        flatDir {
            dirs "$rootProject.projectDir/libs"
        }
        mavenCentral()
    }
}

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

    sourceCompatibility = '1.8'
    targetCompatibility = '1.8'

    configurations {
        developmentOnly
        runtimeClasspath {
            extendsFrom developmentOnly
        }
        compileOnly {
            extendsFrom annotationProcessor
        }
    }

    repositories {
        mavenCentral()
        flatDir {
            dirs "$rootProject.project.buildDir"
        }
    }

    dependencies {
        implementation 'org.springframework.boot:spring-boot-starter-actuator'
        implementation 'org.springframework.boot:spring-boot-starter-web'
        ...

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

        bootRun{
            systemProperties = System.properties
        }

    }

    task initSourceFolders {
        sourceSets*.java.srcDirs*.each {
            if (!it.exists()) {
                it.mkdirs()
            }
        }
        sourceSets*.resources.srcDirs*.each {
            if (!it.exists()) {
                it.mkdirs()
            }
        }
    }
}


project(':corecommon') {
    dependencies {
        compile project(path: ':model')
    }
}

project(':bizcommon') {
    dependencies {
        compile project(path: ':model')
        compile project(path: ':corecommon')
    }
}

project(':frame') {
    dependencies {
        compile project(path: ':model')
        compile project(path: ':corecommon')
        compile project(path: ':bizcommon')
    }
}

project(':web') {
    dependencies {
        compile project(path: ':model')
        compile project(path: ':corecommon')
        compile project(path: ':bizcommon')
        compile project(path: ':frame')
    }
}

由于我的逻辑Main类包含在web项目中,所以我组成web/build.gradle如下。

plugins {

}

bootJar { 
    enabled = true
    archiveBaseName = 'myRoot'
}

jar { enabled = true }

group 'com.myRoot'
version '0.1.1'

dependencies {
    ...

}

task copyTask(type: Copy) {
    copy {
        from 'build/libs'
        into project.parent.buildDir
    }
}

问题是我当地的环境在corecommon上课方面没有错。但是,当我通过 gitlab-runner 部署时,corecommon类没有在web项目中注册。

似乎 gitlab-runner 上的逻辑路径与 my settings.gradleor不兼容build.gradle

有人对这种情况有什么看法吗?

标签: gradlebuild.gradlesettingsgitlab-ci-runner

解决方案


推荐阅读