Kotlin Gradle API 依赖项在消费者中不可用
Kotlin Gradle API dependencies unavailable in consumers
我正在构建一个 Kotlin 库和几个 Web 服务,它们都是库的使用者。该库定义了数据库模型,Web 服务随后可以共同访问和操作这些模型。
这是我的图书馆的 build.gradle
文件:
plugins {
id 'org.jetbrains.kotlin.jvm' version '1.4.10'
}
group 'org.bioround'
version '1.0-SNAPSHOT'
repositories {
mavenCentral()
jcenter()
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib"
api "org.jetbrains.exposed:exposed-core:$exposed_version"
api "org.jetbrains.exposed:exposed-dao:$exposed_version"
api "org.jetbrains.exposed:exposed-jdbc:$exposed_version"
implementation "mysql:mysql-connector-java:$mysqlconnector_version"
implementation "com.zaxxer:HikariCP:$hikaricp_version"
}
请注意 org.jetbrains.exposed
依赖项如何声明为 api
依赖项,因为我想访问这些依赖项在我的 Web 服务中提供的方法。
这是我的一位消费者的 build.gradle
文件,我在其中声明 mylibrary
为本地依赖项:
plugins {
id 'org.jetbrains.kotlin.jvm' version '1.4.10'
}
group 'org.bioround'
version '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib"
implementation files("../mylibrary/build/libs/mylibrary-1.0-SNAPSHOT.jar")
}
但是,我无法在我的消费者服务中访问 org.jetbrains.exposed
中的方法。我希望这些方法可用,因为我在我的库中将它们声明为 api
依赖项。
我做错了什么?
文件依赖是不可传递的,因为.jar
文件不存储任何依赖信息。您的消费项目根本无法知道消费项目的依赖关系。
有几种方法可以解决您的问题:
如果您的项目是强耦合的(例如,如果它们在同一个 SCM 存储库中),您可以使用 multi-project build。这意味着,您的所有项目都使用 include(...)
在中央 settings.gradle
文件中注册。然后,项目可能会依赖于在 dependencies
块中使用 project(...)
的其他项目:
dependencies {
implementation project(':mylibrary')
}
如果您的项目没有直接关联,但您仍想同时开发它们,则可以使用 composite build。通过这种方式,您的项目构建可以在不考虑其他项目的情况下进行设计,但仍然包括它们以在您的 settings.gradle
文件中使用 includeBuild(...)
立即加载任何更改。项目依赖项可以表示为模块依赖项(定义组、工件和版本),但会自动替换为包含的构建。
dependencies {
implementation 'com.example:mylibrary:1.0.0'
}
最后一种可能性是将使用的项目实际包含为外部模块。为此,必须在每次更改时将使用的项目发布到 Maven 存储库,例如本地 Maven 存储库。只需将 Maven 发布插件应用到您使用的项目 plugins { id 'maven-publish' }
并调用任务 publishToMavenLocal
。然后可以使用上面显示的相同依赖关系符号来使用它,只要本地 Maven 存储库已注册:
repositories {
mavenLocal()
}
这种方法的缺点是每次更改都必须发布使用的项目,而使用多项目或复合构建将自动重建您使用的项目。
我正在构建一个 Kotlin 库和几个 Web 服务,它们都是库的使用者。该库定义了数据库模型,Web 服务随后可以共同访问和操作这些模型。
这是我的图书馆的 build.gradle
文件:
plugins {
id 'org.jetbrains.kotlin.jvm' version '1.4.10'
}
group 'org.bioround'
version '1.0-SNAPSHOT'
repositories {
mavenCentral()
jcenter()
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib"
api "org.jetbrains.exposed:exposed-core:$exposed_version"
api "org.jetbrains.exposed:exposed-dao:$exposed_version"
api "org.jetbrains.exposed:exposed-jdbc:$exposed_version"
implementation "mysql:mysql-connector-java:$mysqlconnector_version"
implementation "com.zaxxer:HikariCP:$hikaricp_version"
}
请注意 org.jetbrains.exposed
依赖项如何声明为 api
依赖项,因为我想访问这些依赖项在我的 Web 服务中提供的方法。
这是我的一位消费者的 build.gradle
文件,我在其中声明 mylibrary
为本地依赖项:
plugins {
id 'org.jetbrains.kotlin.jvm' version '1.4.10'
}
group 'org.bioround'
version '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib"
implementation files("../mylibrary/build/libs/mylibrary-1.0-SNAPSHOT.jar")
}
但是,我无法在我的消费者服务中访问 org.jetbrains.exposed
中的方法。我希望这些方法可用,因为我在我的库中将它们声明为 api
依赖项。
我做错了什么?
文件依赖是不可传递的,因为.jar
文件不存储任何依赖信息。您的消费项目根本无法知道消费项目的依赖关系。
有几种方法可以解决您的问题:
如果您的项目是强耦合的(例如,如果它们在同一个 SCM 存储库中),您可以使用 multi-project build。这意味着,您的所有项目都使用 include(...)
在中央 settings.gradle
文件中注册。然后,项目可能会依赖于在 dependencies
块中使用 project(...)
的其他项目:
dependencies {
implementation project(':mylibrary')
}
如果您的项目没有直接关联,但您仍想同时开发它们,则可以使用 composite build。通过这种方式,您的项目构建可以在不考虑其他项目的情况下进行设计,但仍然包括它们以在您的 settings.gradle
文件中使用 includeBuild(...)
立即加载任何更改。项目依赖项可以表示为模块依赖项(定义组、工件和版本),但会自动替换为包含的构建。
dependencies {
implementation 'com.example:mylibrary:1.0.0'
}
最后一种可能性是将使用的项目实际包含为外部模块。为此,必须在每次更改时将使用的项目发布到 Maven 存储库,例如本地 Maven 存储库。只需将 Maven 发布插件应用到您使用的项目 plugins { id 'maven-publish' }
并调用任务 publishToMavenLocal
。然后可以使用上面显示的相同依赖关系符号来使用它,只要本地 Maven 存储库已注册:
repositories {
mavenLocal()
}
这种方法的缺点是每次更改都必须发布使用的项目,而使用多项目或复合构建将自动重建您使用的项目。