从命令行运行时混合java和kotlin代码的ClassNotFoundException
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从命令行运行时混合java和kotlin代码的ClassNotFoundException相关的知识,希望对你有一定的参考价值。
我在一个演示项目中混合了Java
和Kotlin
代码,我想从command line
运行。对于只有java,我能够用java -jar foo.jar
运行程序但是当我使用Kotlin
代码中的任何类时,它会生成java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics
我尝试了不同的解决方案并检查了jar
文件。它包含两个类但我想jar中缺少kotlin-runtime
。
这是build.gradle文件
plugins {
id 'java-library'
id 'org.jetbrains.kotlin.jvm'
}
sourceSets {
main.java.srcDirs += 'src/main/kotlin/'
test.java.srcDirs += 'src/test/kotlin/'
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
testImplementation 'junit:junit:4.12'
}
jar {
manifest {
attributes 'Main-Class': 'com.mallaudin.App'
}
from {
configurations.compile.collect {
it.isDirectory()? it: zipTree(it)
}
}
}
生成的jar
文件的内容
.
├── com
│ └── mallaudin
│ ├── App.class
│ └── User.class
└── META-INF
├── basics.kotlin_module
└── MANIFEST.MF
MANIFEST.MF
的内容
Manifest-Version: 1.0
Main-Class: com.mallaudin.App
我从命令行运行qazxsw poi时得到的异常
jar
问题在于你制造胖罐的方式。虽然您对依赖项使用了更新的和推荐的allaudin@geek ~/Desktop/KotlinLab (master) $ java -jar basics/build/libs/basics.jar
Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics
at com.mallaudin.User.<init>(User.kt)
at com.mallaudin.App.main(App.java:5)
Caused by: java.lang.ClassNotFoundException: kotlin.jvm.internal.Intrinsics
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:190)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:499)
... 2 more
作用域,但您只是向fat jar添加了implementation
配置的内容。
您应该通过compile
替换要在胖jar中使用的配置,runtimeClasspath
是完整的运行时组件集。
那是:
jar {
manifest {
attributes 'Main-Class': 'com.mallaudin.App'
}
from {
configurations.runtimeClasspath.collect {
it.isDirectory()? it: zipTree(it)
}
}
}
查看the documentation以了解java项目的不同依赖配置。
所以,我找到了一个解决方案。在build.gradle
文件中,我用implementation
替换了compile
配置,现在可以使用了。我相信它也应该与implementation
合作,但事实并非如此。现在jar
看起来像这样
.
├── com
├── kotlin
├── META-INF
└── org
以上是关于从命令行运行时混合java和kotlin代码的ClassNotFoundException的主要内容,如果未能解决你的问题,请参考以下文章
Kotlin 测试从命令行失败并出现 ClassNotFoundException 但在 IntelliJ 中工作
Maven 如何编译 java 和 kotlin 编码的混合项目
开发环境Android 命令行中执行 Java 程序 ( IntelliJ IDEA 中创建 Java / Kotlin 工程 | dx 打包 DEX 字节码文件 | dalvikvm 命令 )(代码