首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >kotlinc编译多个文件/依赖性/导入

kotlinc编译多个文件/依赖性/导入
EN

Stack Overflow用户
提问于 2022-01-15 23:02:20
回答 2查看 501关注 0票数 1

我想编译一个带有依赖项/导入的kotlin文件

package_a.kt

代码语言:javascript
复制
// file: package_a.kt
package package_a

fun function_from_package_a(){
    println(" hurray function_from_package_a was called ! ")
}

main.kt

代码语言:javascript
复制
// file: main.kt

import package_a.*

fun main() {
    
    function_from_package_a();

    println("main function  was executed")
}

编译正在与

代码语言:javascript
复制
$ kotlinc package_a.kt -d package_a.jar               
$ kotlinc main.kt -classpath package_a.jar -d main.jar

但是,当我使用java运行main.jar时,我会得到一个错误:

代码语言:javascript
复制
$ java -jar main.jar
Exception in thread "main" java.lang.NoClassDefFoundError: package_a/Package_aKt
        at MainKt.main(main.kt:8)
        at MainKt.main(main.kt)
Caused by: java.lang.ClassNotFoundException: package_a.Package_aKt
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:602)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
        ... 2 more

有人知道为什么吗?

EN

回答 2

Stack Overflow用户

发布于 2022-01-16 02:45:16

使用以下命令编译主类时:

代码语言:javascript
复制
kotlinc main.kt -classpath package_a.jar -d main.jar

生成的main.jar只包含主类对象。它不包含package_a包中的对象。-classpath选项到kotlinc只允许在编译期间解析符号。它不会导致结果main.jar文件中包含任何其他内容。

因此,当您执行:

代码语言:javascript
复制
java -jar main.jar

Java不知道从哪里获取package_a包的内容。

然后,您可能会认为这样做是可行的:

代码语言:javascript
复制
java -classpath package_a.jar -jar main.jar

但是这也不起作用,因为当您指定Java执行jar文件时,所有查找依赖对象的指令,无论是jar文件还是其他地方,都必须来自jar文件本身。当使用-classpath选项时,将忽略-jar选项。

更新:我看到行动部只在发布了我自己的答案后才发帖。运行代码的另一种方式可以工作,因为没有使用-jar选项,因此没有忽略-classpath选项,因此指定的命令告诉Java要执行什么,并告诉它在哪里查找所有必要的类文件。

注意:不需要对原始源文件进行任何更改。主类不需要在命名包中才能在命令行上引用它。该命令将以其原始形式执行代码:

代码语言:javascript
复制
java -cp main.jar:package_a.jar MainKt

另一个选项是将依赖的包包含在main.jar文件中。我试过了,效果很好。这涉及到一些问题,因为您必须获得正确的清单,以便Java知道要执行哪个类。因为OP找到了另一种方法,我不会在这里详述。

票数 1
EN

Stack Overflow用户

发布于 2022-01-16 02:40:05

我找到了解决这个问题的办法

我把我的main.kt改为

代码语言:javascript
复制
// file: main.kt
package test

import package_a.*

fun main() {
    
    function_from_package_a();

    println("main function  was executed")
}

然后我就可以用

代码语言:javascript
复制
java -cp main.jar:package_a.jar test.MainKt
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70726114

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档