Scala和Kotlin的手动JAR编译

我正在尝试为Kotlin创建一个调用Scala代码的概念certificate。

以下是目前项目的情况:

kotlin-src/ hello.kt scala-src/ Hello.scala 

然后编译这两种语言:

 kotlinc kotlin-src/*.kt scalac scala-src/*.scala 

在根目录下生成以下文件:

 META-INF/ main.kotlin_module HelloKt.class HelloScala.class 

我试图变成一个JAR:

 jar cvfM run.jar *.class META-INF 

但是,它不会运行(我认为这是因为我没有指定一个主类)。

 $ java -jar run.jar Error: Invalid or corrupt jarfile run.jar 

所以,我创建了以下清单:

 Main-Class: HelloKt 

在编译jar之前,这个文件被复制到META-INF目录下,结果如下:

 HelloKt.class HelloScala.class META-INF/ META-INF/main.kotlin_module META-INF/MANIFEST.MF 

新的JAR将执行,但总是失败并产生运行时exception。

 $ java -jar run.jar Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics at HelloKt.main(hello.kt) Caused by: java.lang.ClassNotFoundException: kotlin.jvm.internal.Intrinsics at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 1 more 

在Kotlin类中编译和运行主要方法所需的剩余步骤是什么?

是否有需要与Scala / Kotlin代码捆绑在一起的运行时间类来实现这个function?

我没有测试过,但它应该工作:

  1. 编译你的代码,因为你有
  2. 从Maven Central下载kotlin-stdlib jar
  3. validation您在编译时使用了相同版本的stdlib
  4. 运行jar时,用stdlib jar将目录添加到java命令的classpath参数中