我试图使用Kotlin多平台特性在Android和JVM目标之间共享Java代码(示例项目:https://github.com/dmitrykolesnikovich/accessJavaCode-issue)
简单地说,“:library1 1”和“:library1 2”都是针对JVM和Android的Kotlin多平台库。“:图书2”取决于“:图书1”。他们都使用Kotlin和Java。“:library2 2”是指1) Android应用程序和2)桌面(JavaFX)应用程序的依赖关系。这就是为什么1) AAR工件和2) JAR工件都需要(?) -所以我使用了1) Android目标和2) JVM目标,用于“:library2 1”和“:library2 2”。
问题是,当我在“:library1 1”中有Java代码时
public class JavaCode {} // JavaCode.java和Kotlin代码在“:library1 2”中依赖于“:library1 1”
class AccessJavaCode : JavaCode() // AccessJavaCode.ktAndroid目标可以识别Java,但JVM目标不是:
> Task :library2:compileKotlinJvm FAILED
e: AccessJavaCode.kt: (3, 38): Unresolved reference: JavaCode在gradle配置中,我定义了两个插件:kotlin-multiplatform和com.android.library:
apply plugin: "kotlin-multiplatform"
apply plugin: "com.android.library"
kotlin {
targets {
jvm()
android()
}
sourceSets {
jvmMain {
dependencies {
api kotlin("stdlib-common")
api kotlin("stdlib-jdk8")
}
}
androidMain {
dependsOn jvmMain
}
}
}
android {
compileSdkVersion 28
sourceSets {
main {
java.srcDirs += "src/jvmMain/kotlin" // Android target recognizes Java with this
manifest.srcFile "src/androidMain/AndroidManifest.xml"
}
}
}我很确定这是一个简单的与我的梯度文件。非常感谢你们的帮助。
发布于 2020-01-02 01:41:19
编辑
另一个解决问题的方法是,在不丧失为library1生成android存档.aar的能力的情况下,根据原始library1的分裂版本的预编译伪件,为同一库制作一个新版本。
因此,您将得到一个多模块的gradle项目,如下所示:
您可以使用您喜欢的任何东西来发布这些工艺品,但是local maven repo应该工作得很好!
这将意味着取代:
kotlin {
targets {
jvm()
android()
}
sourceSets {
jvmMain {
dependencies {
api kotlin("stdlib-common")
api kotlin("stdlib-jdk8")
}
}
androidMain {
dependsOn jvmMain
}
}
}通过以下方式:
kotlin {
targets {
jvm()
android()
}
sourceSets {
jvmMain {
dependencies {
api kotlin("stdlib-common")
api kotlin("stdlib-jdk8")
api "com.company:library-jvm:1.0.0"
}
}
androidMain {
dependsOn jvmMain
dependencies {
api "com.company:library-android:1.0.0"
}
}
}
}这样,在最终的library1中根本不需要java插件,因为所有的java代码都将在一个单独的步骤中构建。
因此,library1可以同时保留JVM和Android目标
~
为了解决问题,您需要:
Error: The 'java' plugin has been applied, but it is not compatible with the Android pluginslibrary1源文件,请在您的library1项目中启用java插件。java源根的同级目录kotlin中。

更多信息:java-支持jvm-目标的Kotlin文档
我还创建了一个拉请求来解决您的问题。
这种方法的缺点是您无法为.aar生成一个library1存档.jar,但是我想在您的library1项目中使用.jar不应该是一个问题。
library1/build.gradle:
apply plugin: "kotlin-multiplatform"
kotlin {
jvm {
withJava()
}
sourceSets {
jvmMain {
dependencies {
api kotlin("stdlib-common")
api kotlin("stdlib-jdk8")
}
}
}
}library2/build.gradle:
apply plugin: "kotlin-multiplatform"
apply plugin: "com.android.library"
kotlin{
jvm()
android()
sourceSets {
jvmMain.dependencies {
api project(":library1")
}
androidMain {
dependsOn jvmMain
}
}
}
android {
compileSdkVersion 28
sourceSets {
main {
java.srcDirs += "src/jvmMain/kotlin"
manifest.srcFile "src/androidMain/AndroidManifest.xml"
}
}
}https://stackoverflow.com/questions/59479020
复制相似问题