【问题标题】:How to access nested dependencies at compilation time?如何在编译时访问嵌套依赖项?
【发布时间】:2020-03-26 12:09:05
【问题描述】:

我开发了两个库:cms-libcommon-lib

cms-lib 像这样依赖于common-lib

# gradle.build of cms-lib

dependencies {
  implementation 'com.example.shared:common-lib:1.0-SNAPSHOT'
}

common-lib 包含一些公共类 - f.e. com.example.shared.common.Content.java

这个想法是 cms-lib 供第三方客户使用(他们应该在其 gradle 依赖项中声明它),而 common-lib 应该对客户隐藏(客户不必声明其 gradle 依赖项)。所以他们只声明cms-lib - 像这样:

# A
# build.gradle of a consumer of `cms-lib`

dependencies {
  implementation 'com.example.shared:cms-lib:1.0-SNAPSHOT'
}

也就是说common-lib嵌套了cms-lib的依赖。

我希望 cms-lib 的客户可以访问来自嵌套依赖项 common-lib 的公共类。但事实证明,当我收到编译错误时,它们无法访问:

> Task :compileJava FAILED
C:\temp\lib-test\src\main\java\consumer\Controller.java:3: error: package com.example.shared.common does not exist
import com.example.shared.common.Content;

似乎在这种情况下,support-lib 的公共类在编译时不可用(可能仅在运行时)。

如何在编译时访问嵌套的依赖关系?

【问题讨论】:

  • 传递依赖并不意味着依赖包含在顶级 jar 中 - common-lib 必须位于类路径中的某个位置才能编译(和运行)。

标签: java gradle compilation dependencies


【解决方案1】:

您需要将java-library 应用于cms-lib 项目。然后您需要在api 配置中定义common-lib,以便它在cms-lib 的消费者的类路径中可用

您可以在Java library plugin 的文档中阅读有关apiimplementation 的更多信息。

# gradle.build of cms-lib

dependencies {
  api 'com.example.shared:common-lib:1.0-SNAPSHOT'
}


# A
# build.gradle of a consumer of `cms-lib`

dependencies {
  implementation 'com.example.shared:cms-lib:1.0-SNAPSHOT'
}

【讨论】:

  • 只有java-library插件,不是java-library-plugin
  • 谢谢!这个解决方案是我一直在寻找的。这对我很有帮助。
猜你喜欢
  • 2020-02-11
  • 2021-01-26
  • 2012-11-15
  • 1970-01-01
  • 2012-09-02
  • 2019-05-24
  • 1970-01-01
  • 2016-11-01
  • 1970-01-01
相关资源
最近更新 更多