V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
heavyrainn
V2EX  ›  程序员

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

  •  
  •   heavyrainn · 2021-01-05 23:45:34 +08:00 · 1558 次点击
    这是一个创建于 1395 天前的主题,其中的信息可能已经有所发展或是发生改变。

    小弟目前想要开发调用 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 )

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

    2 条回复    2021-01-08 14:23:01 +08:00
    Flywith24
        1
    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
        2
    heavyrainn  
    OP
       2021-01-08 14:23:01 +08:00
    @flywith24 我后来用 shadowJar 解决了…用 gradle shadowJar 打出来的包是可以执行的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1416 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 17:30 · PVG 01:30 · LAX 10:30 · JFK 13:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.