【问题标题】:IntelliJ gradle add module dependencyIntelliJ gradle 添加模块依赖
【发布时间】:2016-12-17 02:35:52
【问题描述】:

使用 IntelliJ 2016.2。
使用 Gradle 2.14.1

我有 2 个项目,每个项目都有自己的 build.gradle 文件和单独的目录结构:

myLib (meant to be jarred and used by others)
  - build.gradle
  - settings.gradle
  - src/main/java/...

sandbox (spring boot web app)
  - build.gradle
  - settings.gradle
  - src/main/java/...
  - src/main/resources/...

希望你能明白这一点。在 IntelliJ 中,我在同一级别(无子项目)具有以下模块结构:

- myLib
- sandbox

简单的请求...我想在sandbox 应用程序中使用myLib。我希望在同一个项目中同时开发这两个模块。

我尝试在 IntelliJ 中为 myLib 添加模块依赖项到 sandbox。没有骰子。我试过添加一个 jar 引用,没有骰子。

我相信我需要在 build.gradle 文件中添加一个依赖项,但无法弄清楚如何。我试过compile files '<path to myLib.jar>'等。没有骰子。

【问题讨论】:

  • 你在这两个模块之外有顶级的bulid.gradle 和settings.gradle 吗?
  • 不,我没有。在同一级别分离 dir 结构。
  • 我意识到我可以在 'sandbox' 中创建 'lib' 目录并在每次重建和 jarred 'myLib' 时复制 'myLib' jar 文件,但我正在寻找更好的解决方案.以为 IntelliJ 和/或 Gradle 会帮我把它放在一起。
  • 这很奇怪,我注意到当我告诉idea 添加对给定模块的依赖项时,它只在.idea 文件中执行此操作,而不是在其他地方。
  • 类似地,如果我在 IntelliJ IDE 项目设置中添加依赖项,那么它会解决 IDE 编辑器中的错误;但是,我无法构建,因为 IntelliJ 没有对 build.gradle 和 settings.gradle 文件进行任何更改。所以我按照下面的解决方案手动添加了依赖项。那是在外部设置文件中我添加了“include ':myLib'”,在构建文件中我添加了“compile project(':myLib')”。显然冒号是 gradle 用来表示子项目层次结构的分隔符

标签: java intellij-idea gradle


【解决方案1】:

本地模块

这是大多数 Gradle 项目所遵循的模式,其中有一个库,然后是使用该库的示例应用 - ref Gradle docs

 - app/
    - build.gradle
    - src/main/java  # where your main class would be 
 - library/
    - build.gradle
    - src/main/java  # dependencies of the app module 
 - settings.gradle
 - build.gradle

在顶级 settings.gradle 你有

include ':library', ':app'

然后在app/build.gradle 中编译包含的项目

dependencies {
    compile project(':library')
}

基本上,顶级build.gradle 是子项目和变量的所有常见配置的包装器。例如,它最常用于 Maven url 的 repositories { } 部分。有关详细信息,请参阅Gradle - Multi-project builds

远程模块

以上内容适用于本地工作,但假设您想与许多其他开发人员共享您的存储库,而不需要让他们下载额外的源代码。然后你会将其他库发布到远程服务器。

当您将这些行添加到您的项目时,这就是您已经在做的事情

implementation("org:artifact:version")

如果您的项目在 GitHub 上公开,请使用jitpack.io 之类的服务。您还可以在 Bintray OSS 或 Maven Central 上设置一个帐户,让您的库与大多数其他库一样可用。

如果您的项目是公司内部的私有,您将需要一些 Maven 类型的服务器,无论是通用 Web 服务器,还是 Nexus 或 Artifactory,您都可以add that with an addition to the repositories block.

repositories {
    maven { url "http://some.maven.site/" }
}

然后照常添加compile 或implementation 源

【讨论】:

  • 这听起来很合理,而且正是我想要做的,但是,我在使用 IntelliJ 解决问题时遇到了一些麻烦。谢谢,我会将此标记为解决方案。只是好奇,你通常用什么IDE?
  • 我使用 Intellij IDEA。不过,我只创建过一个 Gradle Java 项目
  • Could not find method include() for arguments [../My-Library-Name] on root project 'My-Project-Name' of type org.gradle.api.Project.
  • @Ben 确保它是设置文件,而不是构建文件,然后它需要一个模块名称,而不是文件位置 docs.gradle.org/current/dsl/…
  • 除了指向 docs.gradle.org/current/userguide/multi_project_builds.html 的链接之外,答案完全没有帮助。这个链接有帮助。谢谢。
【解决方案2】:

Gradle 3.1 终于解决了这个问题。现在原生支持复合构建。更多here。 简而言之,将此行添加到沙箱 settings.gradle 文件中-

includeBuild '<PATH>/myLib'

如果您无法升级 Gradle,那么您唯一的希望就是将 mylib 工件发布到本地 maven repo 并将 mavenLocal() 添加到 sandbox/build.gradle。

【讨论】:

  • 您的链接似乎缺少 includeBuild 指令
【解决方案3】:

这个答案在现代gradle和intellij中已经过时了,请参考darwinbaisa's answer

原答案

在https://blog.jetbrains.com/idea/2016/10/intellij-idea-2016-3-eap-gradle-composite-builds-and-android-studio-2-2/文章中有讨论

基本上您需要使用复合构建。所以查看 > 工具窗口 > Gradle > 右键单击​​使用库的项目 > 复合构建配置 > 勾选您要使用本地版本的库项目。

进行重建,然后应该使用本地依赖

【讨论】:

  • 截至 Idea 2019.1 社区版,那里没有Composite Build Configuration
  • @EugeneGr.Philippov 是的,在较新的版本中,darwinbaisa 的答案是要走的路
【解决方案4】:

最简单的方法是将 lib 文件夹保留在项目的父目录中,并在模块 build.gradle 文件中包含以下行

implementation fileTree(dir: '../libs', include: ['*.jar'])
implementation fileTree(dir: '../libs', include: ['*.aar'])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    • 2017-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多