如何使用命令行编译Kotlin并包含Java的jar文件?

4

我想在Kotlin中引用Java的jar包。我尝试了以下方法,但是出现了错误。

javac -encoding utf-8 javasorce/test/JavaTestClass.java
jar cvf javasorce/test/JavaTestClass.jar javasorce/test/JavaTestClass.class

kotlinc kotlin/CallJavaTestClass.kt -cp javasorce/test/JavaTestClass.jar -include-runtime -d kotlin/CallJavaTestClass.jar

java -jar kotlin/CallJavaTestClass.jar

错误是:
Exception in thread "main" java.lang.NoClassDefFoundError: 
javasorce/test/JavaTestClass at CallJavaTestClassKt.main(CallJavaTestClass.kt:5)
        Caused by: java.lang.ClassNotFoundException: javasorce.test.JavaTestClass
                at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
                at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
                at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
                at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
                ... 1 more

我正在使用以下目录:

root
|-javasorce
| |-test
|   |-JavaTestClass.java
|-kotlin
  |-CallJavaTestClass.kt

请告诉我是否有解决方案。

1个回答

3

除了在编译时使用Java库的classpath编译源代码外,还需要在运行时使用相同的classpath运行程序:如果某个类在编译时存在,则在运行时也需要将其放在classpath中以便使用。

运行一个将其类散布在几个JAR文件中的应用程序的正确方法是将这些JAR文件作为类路径传递给java命令,并额外指定具有main函数的类:

java CallJavaTestClassKt -cp kotlin/CallJavaTestClass.jar:javasorce/test/JavaTestClass.jar

上述命令假定您将main函数放置在CallJavaTestClass.kt的顶层(在这种情况下,类名由文件名形成,.kt替换为Kt),且没有package ...声明。如果您有一个包,请在类名前加上它,如com.example.FileNameKt。如果您在对象或伴生对象中声明了main,请使用类名或对象名称(不带Kt)代替CallJavaTestClassKt
另请参见:如何从命令行运行Kotlin类?

2
多亏了你,我解决了!你的答案非常容易理解! 你的大部分答案都是正确的,但有一个错误。运行应用程序的正确方式不是 java CallJavaTestClassKt -cp kotlin/CallJavaTestClass.jar:javasorce/test/JavaTestClass.jar 而是 java -cp kotlin/CallJavaTestClass.jar:javasorce/test/JavaTestClass.jar CallJavaTestClassKt。在你的建议中,java 找不到 CallJavaTestClassKt。 - naokichi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接