请问,使用 IDEA 开发 kotlin,使用 gradle 打包 jar 包时,貌似如果 dependencies 中依赖的 jar 包过多,执行 jar 包时就会报“错误: 找不到或无法加载主类”怎么办…

2021-01-05 23:45:34 +08:00
 heavyrainn

小弟目前想要开发调用 KETTLE 作业的程序,由于需要引用 KETTLE 中所有依赖 jar 包,打包完的 jar 包大小约有 160M 。结果执行时报错“错误: 找不到或无法加载主类”。gradle 结构非常简单,如下:

plugins {
    id 'org.jetbrains.kotlin.jvm' version '1.4.21'
    id 'com.github.johnrengelman.shadow' version '6.1.0'
}

group 'org.example'
version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib"
    compile fileTree(dir:'/Users/xxl/data-integration8.2/lib',include:['*.jar'])
}

jar {
    from { configurations.compileClasspath.collect { it.isDirectory() ? it : zipTree(it) } }
    //设置 zip64,避免报 65535 错误
    zip64 true
}

只要将 compile fileTree(dir:'/Users/xxl/data-integration8.2/lib',include:['*.jar'])注释,或者减少依赖 jar 包数量,执行就可以正常(不过就会因为缺少依赖报 java.lang.NoClassDefFoundError 了 T.T )

请问这种情况如何处理呢,非常感谢

1470 次点击
所在节点    程序员
2 条回复
Flywith24
2021-01-06 08:48:35 +08:00
我认为是 /Users/xxl/data-integration8.2/lib 指向的 本地 jar 导致的。很好理解,A 内部引用本地 jar B,此时把 A 打包成 jar 提供其他设备使用是无法找到 B 的(因为它在发布 A 的机器上)。需要做的改动便是把 B 发布出来,使用远程依赖的方式引用,这样其他设备便可以在开发者配置的 maven 仓库中找到 B 。
heavyrainn
2021-01-08 14:23:01 +08:00
@flywith24 我后来用 shadowJar 解决了…用 gradle shadowJar 打出来的包是可以执行的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/742030

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX