kotlin gradle api依赖项在使用者中不可用

31moq8wy  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(634)

我正在建立一个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 我的库中的依赖项。
我做错什么了?

xa9qqrwz

xa9qqrwz1#

文件依赖项不可传递,因为 .jar 文件不存储任何依赖关系信息。您的消费项目根本无法知道消费项目的依赖关系。
有几种方法可以解决您的问题:
如果项目是强耦合的(例如,如果它们位于同一个scm存储库中),则可以使用多项目生成。这意味着,您的所有项目都在一个中心注册 settings.gradle 文件使用 include(...) . 然后,项目可能依赖于使用 project(...) 内部 dependencies 块:

dependencies {
    implementation project(':mylibrary')
}

如果您的项目不是直接相关的,但是您仍然希望同时开发这两个项目,那么您可以使用复合构建。这样,您的项目构建就可以在不考虑其他项目的情况下进行设计,但仍然包括它们,以便使用 includeBuild(...) 在你的 settings.gradle 文件。项目依赖关系可以表示为模块依赖关系(定义组、工件和版本),但是将被包含的构建自动替换。

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

最后一种可能性是实际将已使用的项目作为外部模块包含。要使其工作,必须在每次更改时将已使用的项目发布到maven存储库,例如本地maven存储库。只需将maven发布插件应用于您的项目 plugins { id 'maven-publish' } 并调用任务 publishToMavenLocal . 然后,只要注册了本地maven存储库,就可以使用上面显示的相同依赖关系表示法来使用它:

repositories {
    mavenLocal()
}

这种方法的缺点是每次更改都必须发布已使用的项目,而使用多项目或组合生成将自动重新生成已使用的项目。

相关问题