为多模块gradle项目创建单个源jar

为多模块gradle项目创建单个源jar,gradle,build,multi-module,build-system,Gradle,Build,Multi Module,Build System,我有一个多模块gradle项目设置,如下所示: Module A (Parent) -build.gradle -settings.gradle +Module B --src ---main ----java ----kotlin --build.gradle +Module C --src ---main ----java ----kotlin --build.gradle 在本例中,模块B在编译时依赖于模块C 我想创建一个sources jar,其中包含所有子项目的源代码,以发布到我的存

我有一个多模块gradle项目设置,如下所示:

Module A (Parent)
-build.gradle
-settings.gradle
+Module B
--src
---main
----java
----kotlin
--build.gradle
+Module C
--src
---main
----java
----kotlin
--build.gradle
在本例中,模块B在编译时依赖于模块C

我想创建一个sources jar,其中包含所有子项目的源代码,以发布到我的存储库中

在单模块构建中,我已将以下内容添加到我的项目中,但将其添加到所有子项目中不会导致在生成的sources jar中收集源集:

sourceSets {
    main.kotlin.srcDirs += 'src/main/kotlin'
    main.java.srcDirs += 'src/main/java'
}

task sourcesJar(type: Jar) {
    from sourceSets.main.kotlin
    from sourceSets.main.java
    archiveClassifier = 'sources'
}

我该怎么做?ShadowJar可以工作,但不幸的是,据我所知,ShadowJar没有提供创建源jar的选项。

我们找到了一个解决方案-将子模块部署为独立的源jar,并单独包含它们

例如,在每个子模块中:

sourceSets {
    main.kotlin.srcDirs += 'src/main/kotlin'
    main.java.srcDirs += 'src/main/java'
}

task sourcesJar(type: Jar) {
    from sourceSets.main.kotlin
    from sourceSets.main.java
    archiveClassifier = 'sources'
}

publishing {
    publications {
        mavenJava(MavenPublication) {
            groupId = rootProject.group
            artifactId = "$rootProject.name-$project.name"
            version = rootProject.project.version
            from components.java
            artifact sourcesJar
        }
    }

我们已经找到了一个解决方案——将子模块作为独立的源jar进行部署,并在单个基础上包含它们

例如,在每个子模块中:

sourceSets {
    main.kotlin.srcDirs += 'src/main/kotlin'
    main.java.srcDirs += 'src/main/java'
}

task sourcesJar(type: Jar) {
    from sourceSets.main.kotlin
    from sourceSets.main.java
    archiveClassifier = 'sources'
}

publishing {
    publications {
        mavenJava(MavenPublication) {
            groupId = rootProject.group
            artifactId = "$rootProject.name-$project.name"
            version = rootProject.project.version
            from components.java
            artifact sourcesJar
        }
    }

出于好奇,您为什么想要一个单一的源jar呢?在我们的用例中,多模块项目作为一个库运行,由位于其他地方的应用程序依赖。实际上,依赖于模块C的子模块比我的示例中的子模块多,目前我们希望能够从其他应用程序中依赖它们。子模块本身都是非常轻量级的,因此如果可能的话,我们希望避免创建存储库集合来容纳它们。出于好奇,为什么您希望有一个单一的源jar?在我们的用例中,多模块项目作为一个库,由位于其他地方的应用程序依赖。实际上,依赖于模块C的子模块比我的示例中的子模块多,目前我们希望能够从其他应用程序中依赖它们。子模块本身都是非常轻量级的,因此如果可能的话,我们希望避免创建存储库集合来容纳它们。