当前位置: 首页 > 知识库问答 >
问题:

从不同的gradle模块导入类

钮晟
2023-03-14

我有一个由两个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')

}

问题是,我不能从客户端模块中导入任何在核心模块中定义的类。然而,反过来也行。这可能是因为我们提到了编译项目(:客户端)作为“核心”模块的依赖项。当我把编译项目(: core)作为客户端模块的依赖项时,IntelliJ允许我将核心模块中的类导入客户端。然而,gradle随后正确地声称这两个模块之间存在循环构建依赖关系。

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

共有1个答案

常甫
2023-03-14

我们提到编译项目(':clients')作为'core'模块的依赖项

你为什么需要这个?如果您这样做,那么您就不能在客户机中使用核心中的类,因为要编译它们,您需要先编译客户机,但要编译客户机您需要核心中的类,等等。

如果您只需要core中的clients中的一些特定类,则可以将它们移动到第三个模块中,clientcore都依赖于该模块。或者对客户机中所需的核心中的类执行相同的操作。

如果特定类之间存在循环依赖关系(例如,来自核心的类a需要从客户端导入B,需要再次导入a;循环可能包含两个以上的类),则它们必须位于单个模块中。

 类似资料:
  • 我已经将volley库克隆为 我如何将其作为模块导入到我的android studio项目中,该项目由gradle提供支持,类似于IntelliJ Idea中的“导入模块”选项。

  • 问题内容: 我有一个使用内置模块的Python脚本,但也导入了与主脚本本身位于同一目录中的许多自定义模块。 例如,我会打电话 和agent.py具有许多导入,包括: 其中checks与agent.py位于同一目录中的文件 当前工作目录为agent /时,一切都很好。但是,如果我从任何其他目录调用agent.py,则显然无法导入checks.py等错误。 我如何确保可以导入自定义模块,而不管从哪里调

  • 我的项目有以下结构: 以下是的部分内容:

  • 问题 你想给某个已存在模块中的函数添加装饰器。 不过,前提是这个模块已经被导入并且被使用过。 解决方案 这里问题的本质就是你想在模块被加载时执行某个动作。 可能是你想在一个模块被加载时触发某个回调函数来通知你。 这个问题可以使用10.11小节中同样的导入钩子机制来实现。下面是一个可能的方案: # postimport.py import importlib import sys from coll

  • 我是一个(普通的)Gradle多项目构建,我有一个根,有四个子项目。每个都有自己的版本。gradle和普通版本。gradle,设置。格雷德尔和格雷德尔。根文件夹中的属性。 这一切都像预期的那样构建了一个作品——除了一件事我不明白: 将gradle构建导入IntelliJ时(从外部模型导入)IntelliJ在根级别创建两个单独的模块。一个标记为普通模块,一个标记为分组模块。让我惊讶的是后者——为什么

  • 问题内容: 我已尝试找到有关最佳使用还是全面的指南。我刚开始使用Python,并且正在尝试着眼于最佳实践。 基本上,我希望有人能分享他们的经验,其他开发人员有什么喜好,以及避免遇到麻烦的最佳方法是什么? 问题答案: 和之间的区别主要是主观的。选择最喜欢的一个,并在使用中保持一致。这里有一些要点可以帮助你做出决定。 优点: - 减少维护你的import报表。无需添加任何其他导入即可开始使用模块中的另