Gradle:在多个子项目中包含相同的 SourceSet

标签 gradle intellij-idea groovy gradle-groovy-dsl

如何将单个源集添加到多个子项目?
首先 ...是的,我知道这有多荒谬。这只是我必须做的事情。
设置

  • 该项目使用 Groovy DSL。
  • 有 3 个子项目(A、B、C),每个子项目都有自己独特的主源集。
  • 这些项目之外还有 5 个额外的源集(1、2、3、4、5)。
  • 可以单独编译外部源集的 Nonce。
  • 所有源集都依赖于在每个子项目中定义 3 个不同时间的接口(interface)。
  • 子项目主源不能依赖任何外部源
  • 1和2需要用A、B、C编译。
  • 3需要用A和B编译。
  • 4 需要用 B 和 C 编译
  • 5 只需要用 C 编译。
  • 4 和 5 需要依赖于 2 中定义的类。
  • 5 必须是一个独立的源集,以便它可以作为源集包含在任何 future 可能添加的子项目中。
  • 不允许任何外部源包含来自任何其他源集的源
  • 不允许单独编译任何外部源。
  • 不允许将任何外部源包含为 jar 或项目依赖项;它们必须作为源集包含在内,并且必须为包含它们的每个子项目单独编译。

  • 一种
    sourceSets {
        main {
            java {
                srcDirs = ["src",
                           "$rootDir/source_sets/1/src",
                           "$rootDir/source_sets/2/src",
                           "$rootDir/source_sets/3/src"
                ]
            }
        }
    }
    
    sourceSets {
        main {
            java {
                srcDirs = ["src",
                           "$rootDir/source_sets/1/src",
                           "$rootDir/source_sets/2/src",
                           "$rootDir/source_sets/3/src",
                           "$rootDir/source_sets/4/src"
                ]
            }
        }
    }
    
    C
    sourceSets {
        main {
            java {
                srcDirs = ["src",
                           "$rootDir/interfaces/source_sets/1/src",
                           "$rootDir/interfaces/source_sets/2/src",
                           "$rootDir/interfaces/source_sets/4/src",
                           "$rootDir/interfaces/source_sets/5/src"
                ]
            }
        }
    }
    
    设置.gradle
    include(":interfaces/A")
    project(":interfaces/A").name = "A"
    
    include(":interfaces/A")
    project(":interfaces/A").name = "A"
    
    include(":interfaces/A")
    project(":interfaces/A").name = "A"
    
    问题是 4 和 5 无法找到 2 中的类,我的 IDE(IntelliJ)无法解析正确的类路径。
    我真正需要的是让外部源集表现得好像它们有 3 个单独的副本,而实际上没有 3 个单独的副本,我需要这样做 没有 使用符号/软链接(soft link)。
    该解决方案只需要使用 gradle,但它可以使用 JetBrains 的“idea”插件进行 gradle,只要它不涉及提交“.idea”文件夹下的任何文件,但它可以包含内联 xml 或资源文件夹中的文件在 .idea 文件夹之外。
    所以是的......这太复杂了,只是......呃!但事实就是如此。

    最佳答案

    确实。

    我没有答案,但这太长了,无法发表评论。所以这里。

    我认为这只是 IntelliJ 的问题,而不是使用 Gradle 编译时的问题,对吧?如果是这种情况,您应该尝试根据需要在 IntelliJ 中为您的项目建模,一旦您找到了一种方法,然后弄清楚如何使用自定义 Idea 插件为您完成它。

    但是,我很确定 IntelliJ 中的多个模块不能共享相同的“内容根”。所以我只看到你不想要的选项 - 要么复制(同步)源与仅用于 IntelliJ 的新文件夹(不允许修改),创建符号链接(symbolic link)(并不总是可移植)或重组您的外部源,以便它们可以独立编译(这可能不容易)

    :-(

    关于Gradle:在多个子项目中包含相同的 SourceSet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58290185/

    相关文章:

    Android/Gradle : Where is this dependency embedded?

    intellij-idea - 在运行配置停止之前未连接应用程序服务器,原因 : java. io.IOException:无法检索 RMIServer stub :

    java - Intellij-idea看不到生成的源目录

    intellij-idea - 跳转到 Intellij IDEA 中的编辑器快捷方式

    android - 将 APK 文件从构建位置复制到 gradle 4.4 中的其他位置

    gradle - 无法在 gradle 中配置属性文件

    javafx - 如何通过Gradle将文件复制到空目录

    java - 在Gradle中运行测试的子集

    validation - 如何在Groovy中针对特定格式对字段进行验证

    groovy - Groovy Trait 返回适合方法链接的实现类型吗