如何编译Kotlin以将Java jar包含在命令行中?
问题描述:
我想包括jar的jar到Kotlin。我尝试像下面,但我有错误。如何编译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
请告诉我,如果有解决方案。
答
除了在类路径上用Java库编译源代码之外,还需要在类路径中使用相同的库运行该程序:如果某个类在编译时存在,则需要在类路径上运行时间以及能够使用它。
运行,其具有它的类分散在几个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
。
谢谢你,我解决了!你的答案非常非常容易理解! 你的答案大部分是正确的,但有一个错误。运行应用程序的正确方式不是'java CallJavaTestClassKt -cp kotlin/CallJavaTestClass.jar:javasorce/test/JavaTestClass.jar',而是'java -cp kotlin/CallJavaTestClass.jar:javasorce/test/JavaTestClass.jar CallJavaTestClassKt'。在你的建议中,'java'找不到CallJavaTestClassKt。 – naokichi