提问者:小点点

静态编程语言GradleAPI在消费者中不可用的依赖项


我正在构建一个静态编程语言库和几个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依赖项。

我到底做错了什么?


共1个答案

匿名用户

文件依赖关系不是可传递的,因为。jar文件不存储任何依赖信息。您的消费项目根本无法知道已消费项目的依赖关系。

有几种方法可以解决您的问题:

如果您的项目是强耦合的(例如,如果它们在同一个SCM存储库中),您可以使用多项目构建。这意味着,您的所有项目都使用include(…)在中央settings. gradle文件中注册。然后,项目可能会使用依赖项块中的project(…)依赖于其他项目:

dependencies {
    implementation project(':mylibrary')
}

如果您的项目没有直接关系,但您仍然希望同时开发它们,您可以使用复合构建。这样,您可以在不考虑其他项目的情况下设计项目的构建,但仍然包含它们以立即使用settings. gradle文件中的include deBuild(…)加载任何更改。项目依赖关系可以表示为模块依赖关系(定义组、工件和版本),但会自动被包含的构建替换。

dependencies {
    implementation 'com.example:mylibrary:1.0.0'
}

最后一种可能性是实际将已使用的项目作为外部模块包含在内。为此,必须在每次更改时将已使用的项目发布到Maven存储库,例如本地Maven存储库。只需将Maven Publish Plugin应用于已使用的项目plugins{id'maven-发布'}并调用taskPublishToMavenLocal。然后可以使用上述相同的从属记数法进行消费,只要本地Maven存储库已注册:

repositories {
    mavenLocal()
}

这种方法的缺点是必须为每次更改发布使用的项目,而使用多项目或复合构建将自动重建您使用的项目。