我有一个多模块项目,其结构如下:
|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
答案 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"
}
对于您而言,您应该使用allprojects
或subprojects
,这意味着您放置在该块中的所有配置都将应用于所有项目(包括根)。在后一种情况下,该块将仅应用于子项目(不包括根目录)。看起来像这样:
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
项目添加为该项目frontend
中build.gradle
项目的依赖项。我强烈建议您阅读Gradle Documentation,因为这是Gradle问题,不是是Kotlin问题。