带有子项目的Gradle复合构建依赖项magamenet

问题描述

一些研究:

我发现了两个类似的问题,但似乎没有一个我有用:

Define an artifact to be used as a dependency in another project

Gradle Composite Build,transitive dependency is not resolved

我刚刚开始使用gradle,所以有很多我不太了解:

  • 如何使用由“ composite”项目构建的 .jar 文件作为依赖项
  • 然后,如何使用子项目生成 .jar 文件作为依赖项

最小示例

我试图提出一个非常简单的示例,其中包括问题的所有必要内容

所以我的项目结构如下:

+ GradleTest    // this is the main project,ideally it will only depend on calculator
| -- + calculator    // calculator will depend on square as a composite build
     | -- build.gradle
     | -- settings.gradle
     + square    // this project does not depend on anything (I can build this one without a problem)
     | -- build.gradle
     | -- settings.gradle
| -- build.gradle
| -- settings.gradle

.gradle 文件

GradleTest / build.gradle

buildscript {
    version = '0.3.0'

    ext {
        main_group = 'org.gradler'
    }
}

plugins {
    id 'java'
}

group "${main_group}"

repositories {
    mavenCentral()
    flatDir {
        dirs 'libs'
    }
}

dependencies {
    implementation name: 'calculator'
}

jar {
    group = "${main_group}"

    from configurations.compileClasspath.collect {
        println ("Zipping compile class path: ${it.getName()}")
        it.isDirectory() ? it : zipTree(it)
    }

    manifest {
        println("Packing jar file: ${archiveFile.get()}")
        println("Packing jar file: group: ${getGroup()} | version: ${archiveVersion.get()}")

        attributes(
                'Class-Path': configurations.compileClasspath.collect {
                    println ("Collecting compile class path: ${it.getName()}")
                    it.getName()
                }.join(' '),'Main-Class': "${getGroup()}.Main"
        )
    }
}

GradleTest / settings.gradle

rootProject.name = 'GradleTest'

include 'calculator'

GradleTest / calculator / build.gradle

buildscript {
    version = '0.2.0'

    ext {
        main_group = 'org.mathics'
    }
}

plugins {
    id 'java'
}

group "${main_group}"

repositories {
    mavenCentral()
    flatDir {
        dirs 'libs'
    }
}

dependencies {
    implementation name: 'square'
}

jar {
    group = "${main_group}"

    from configurations.compileClasspath.collect {
        println ("Zipping compile class path: ${it.getName()}")
        it.isDirectory() ? it : zipTree(it)
    }

    manifest {
        println("Packing jar file: ${archiveFile.get()}")
        println("Packing jar file: group: ${getGroup()} | version: ${archiveVersion.get()}")

        attributes(
                'Class-Path': configurations.compileClasspath.collect {
                    println ("Collecting compile class path: ${it.getName()}")
                    it.getName()
                }.join(' '),'Main-Class': "${getGroup()}.Main"
        )

        copy {
            from "${archiveFile.get()}"
            into '../libs/'
            rename "calculator-${archiveVersion.get()}.jar","calculator.jar"
        }
    }
}

GradleTest / calculator / settings.gradle

rootProject.name = 'calculator'

includeBuild('../square')

GradleTest / square / build.gradle

buildscript {
    version = '0.1.0'

    ext {
        main_group = 'org.equations'
    }
}

plugins {
    id 'java'
}

group "${main_group}"

jar {
    group = "${main_group}"

    manifest {
        println("Packing jar file: ${archiveFile.get()}")
        println("Packing jar file: group: ${getGroup()} | version: ${archiveVersion.get()}")

        attributes(
                'Class-Path': configurations.compileClasspath.collect { it.getName() }.join(' '),'Main-Class': "${getGroup()}.Main"
        )

        copy {
            from "${archiveFile.get()}"
            into '../calculator/libs/'
            rename "square-${archiveVersion.get()}.jar","square.jar"
        }
    }
}

GradleTest / square / settings.gradle

rootProject.name = 'square'

到目前为止我尝试过的事情:

自然地,我尝试从头开始构建项目,然后一切正常:

  1. 建立正方形->创建jar文件->将其复制到计算器的 libs文件
  2. 构建计算器->因为现在可以在 libs 中找到 square.jar ,它也可以构建(,但是如果我尝试直接构建计算器,则不会! )->将Calculator.jar复制到顶部的 libs 文件
  3. 现在我也可以构建主项目了。

我意识到这种方法几乎不理想,因为我多次构建 .jar 文件并复制它们,但是我真的没有主意。

对于如何使这项工作变得更好,我将保持开放态度。

但是这里的主要目标是,对于初学者,我主要想要两个独立的 gradle 项目,其中一个依赖于另一个。说,我希望项目 B C ,而 B 依赖于 C 。 此外,应该有一个同时依赖于这两个“父”项目,或者,因为 B 依赖于 C ,所以对于“父”项目来说就足够了 A 仅依赖于 B


任何帮助表示赞赏!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)