同级项目似乎未使用其依赖项的build.gradle脚本

时间:2018-07-15 08:43:43

标签: gradle kotlin

我有一个多模块项目,其结构如下:

|fullstack
\backend
 |build.gradle
\frontend
 |build.gradle
|build.gradle
|settings.gradle

Settings.gradle:

rootProject.name = 'fullstack'
include 'backend'
include 'frontend'

backend取决于ktor,因此build.gradle包含存储库:

maven { url "https://dl.bintray.com/kotlin/ktor" }

backend模块的构建良好。

然后,我想在后端和前端之间共享一些通用类。我可以制作第三个模块api并让其他人依赖它。但是现在我要避免使用第三个模块,而仅使frontend依赖于backend。 我将依赖项添加到frontend的{​​{1}}:

gradle.build

并尝试构建整个项目,但出现错误:

  

无法解析所有文件进行配置   ':frontend:compileClasspath'。

     
    

找不到io.ktor:ktor-server-netty:0.9.1。在以下位置搜索:           https://repo.maven.apache.org/maven2/io/ktor/ktor-server-netty/0.9.1/ktor-server-netty-0.9.1.pom           https://repo.maven.apache.org/maven2/io/ktor/ktor-server-netty/0.9.1/ktor-server-netty-0.9.1.jar     要求:           项目:frontend>项目:后端

  

它显然没有扫描compile project (':backend') 模块的存储库。为什么?

更新 如答案中所述,我已经添加了存储库。但是,当我尝试从backend导入frontend/main.kt的任何类时,我得到:

  

:frontend:compileKotlin2Jse:D:\ ... \ frontend \ src \ main \ kotlin \ main.kt:(1,8):未解析的参考:com
  e:D:\ ... \ frontend \ src \ main \ kotlin \ main.kt:(2,8):未解析的参考:com

如何使其在backend中可见?

frontend

build.gradle

2 个答案:

答案 0 :(得分:1)

依赖关系是可传递的,但存储库不是。这就是为什么大多数项目在根构建文件中都有一个allprojects块的原因,该块同时定义了所有子项目的存储库。

答案 1 :(得分:1)

问题在于可能有2个dependencies / repositories块。第一个在buildscript中,如下所示:

buildscript {
    repositories {
        jcenter()
        mavenCentral()
        maven { url "https://dl.bintray.com/kotlin/ktor" }
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"
    }
}

这负责设置工具插件。然后,当您设置项目本身的配置时,您可以做几件事。如果您没有多模块项目,只需将其转储到build.gradle中,则文件如下所示:

buildscript {

    repositories {
        jcenter()
        mavenCentral()
        maven { url "https://dl.bintray.com/kotlin/ktor" }
    }

    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"
    }
}

repositories {
    jcenter()
    mavenCentral()
    maven { url "https://dl.bintray.com/kotlin/ktor" }
}

dependencies {
    compile "io.ktor:ktor-server-core:$ktor_version"
}

对于您而言,您应该使用allprojectssubprojects,这意味着您放置在该块中的所有配置都将应用于所有项目(包括根)。在后一种情况下,该块将仅应用于子项目(不包括根目录)。看起来像这样:

buildscript {

    repositories {
        jcenter()
        mavenCentral()
        maven { url "https://dl.bintray.com/kotlin/ktor" }
    }

    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"
    }
}

subprojects {

    repositories {
        jcenter()
        mavenCentral()
        maven { url "https://dl.bintray.com/kotlin/ktor" }
    }

    dependencies {
        compile "io.ktor:ktor-server-core:$ktor_version"
    }
}

您的问题是您没有将存储库本身添加到您的项目配置中,仅将您的buildscript配置添加到了

如果您打算混合使用前端代码和后端代码,现在可以使用Kotlin Multiplatform Projects。我已经写过这个here

回复您的修改:

您确实需要将所有这些内容移至subprojects块中:

subprojects {
    apply plugin: 'java'
    apply plugin: 'kotlin'

    sourceCompatibility = 1.8

    dependencies {
        compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
        testCompile group: 'junit', name: 'junit', version: '4.12'
    }

    compileKotlin {
        kotlinOptions.jvmTarget = "1.8"
    }
    compileTestKotlin {
        kotlinOptions.jvmTarget = "1.8"
    }

    jar {
        manifest {
            attributes 'Main-Class': 'com.norg.parts.MainKt'
        }
    //TODO    include jar from frontend!
    }
}

,并且还需要将backend项目添加为该项目frontendbuild.gradle项目的依赖项。我强烈建议您阅读Gradle Documentation,因为这是Gradle问题,不是是Kotlin问题。