微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决带有子项目的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 举报,一经查实,本站将立刻删除。