【问题标题】:Import class from a different gradle module从不同的 gradle 模块导入类
【发布时间】:2017-09-07 01:30:31
【问题描述】:

我有一个项目,由两个 gradle 项目组成,在 build.gradle 文件中定义如下。

project(':clients') {
  archivesBaseName = "clients"

  dependencies {  
    compile libs.lz4
    compile libs.snappy
    compile libs.slf4jApi

    testRuntime libs.slf4jlog4j
  }

  jar {
    dependsOn createVersionFile
    from("$buildDir") {
        include "proj/$buildVersionFileName"
    }
  }

}

project(':core') {
  apply plugin: 'scala'
  apply plugin: "org.scoverage"
  archivesBaseName = "proj_${versions.baseScala}"

  dependencies {
    compile project(':clients')
    compile libs.joptSimple
    compile libs.metrics
    compile libs.scala
    compile libs.slf4jlog4j
    compile libs.zkclient
    compile libs.zookeeper
    compile libs.scalaParserCombinators

  }

  tasks.create(name: "copyDependantLibs", type: Copy) {
    from (configurations.testRuntime) {
      include('slf4j-log4j12*')
    }
    from (configurations.runtime) {
      exclude('kafka-clients*')
    }
    into "$buildDir/dependant-libs-${versions.scala}"
    duplicatesStrategy 'exclude'
  }

  jar {
    dependsOn('copyDependantLibs')
  }

  tasks.create(name: "copyDependantTestLibs", type: Copy) {
    from (configurations.testRuntime) {
      include('*.jar')
    }
    into "$buildDir/dependant-testlibs"
    duplicatesStrategy 'exclude'
  }

  systemTestLibs.dependsOn('jar', 'testJar', 'copyDependantTestLibs')

}

问题是我无法从“clients”模块中导入“core”模块中定义的任何类。然而,反之亦然。 这可能是因为我们提到 compile project(':clients') 作为“核心”模块的依赖项。当我将compile project(':core') 作为“客户端”模块的依赖项时,IntelliJ 允许我将“核心”模块中的类导入“客户端”。但是,gradle 然后正确地声称这两个模块之间存在循环构建依赖关系。

总而言之,如何使“核心”中的类在“客户端”内部可访问,而不会将它们作为彼此的编译依赖项。

【问题讨论】:

  • 您是否定义了settings.gradle 文件?基本上它应该正常工作
  • 使clients成为core的子项目。
  • @Opal 我确实有一个settings.gradle 文件,但它只是说include 'core', 'clients'

标签: java scala intellij-idea gradle


【解决方案1】:

我们提到 compile project(':clients') 作为 'core' 模块的依赖项

为什么需要这个?如果你这样做了,那么你不能在clients中使用来自core的类,因为要编译它们你需要先编译clients,但是要编译clients你需要来自core的类,等等

如果您只需要 core 中的 clients 中的某些特定类,您可以将它们移动到 clientcore 都依赖的第三个模块中。或者对 core 中的类执行相同操作,您需要在 clients 中。

如果你在特定类之间存在循环依赖(例如类A from core需要从clients导入B,这需要再次导入A;循环可能包含2个以上的类),那么它们必须在一个模块中。

【讨论】:

  • 那你是说不改变项目结构就没有办法解决这个问题?
  • 不,没有(除非我误解了您的需要)。根据您的确切要求,另一件可能有所帮助的事情是不要直接在clients 中引用来自core 的类,而是在clients 中定义接口并使core 类实现这些接口。
猜你喜欢
  • 2021-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多