代码之家  ›  专栏  ›  技术社区  ›  mallaudin

从命令行运行时混合Java和KOTLIN代码的CaseNojFutuxExpCCEP

  •  0
  • mallaudin  · 技术社区  · 6 年前

    我混了 Java 和; Kotlin 我要运行的演示项目中的代码 command line . 对于只有Java,我能够运行程序 java -jar foo.jar 但是当我使用来自 科特林 代码, 它产生 java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics

    我尝试过不同的解决方案,并检查了 jar 文件。它包含两个类,但我猜 kotlin-runtime 从罐子里找不到。

    这里是 平地 文件

    plugins {
        id 'java-library'
        id 'org.jetbrains.kotlin.jvm'
    }
    
    sourceSets {
        main.java.srcDirs += 'src/main/kotlin/'
        test.java.srcDirs += 'src/test/kotlin/'
    }
    
    dependencies {
        implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
        testImplementation 'junit:junit:4.12'
    }
    
    jar {
        manifest {
            attributes 'Main-Class': 'com.mallaudin.App'
        }
        from {
            configurations.compile.collect {
                it.isDirectory()? it: zipTree(it)
            }
        }
    }
    

    生成的内容 罐子 文件

    .
    ├── com
    │   └── mallaudin
    │       ├── App.class
    │       └── User.class
    └── META-INF
        ├── basics.kotlin_module
        └── MANIFEST.MF
    

    内容 MANIFEST.MF

    Manifest-Version: 1.0
    Main-Class: com.mallaudin.App
    

    我跑步时遇到的例外情况 罐子 表单命令行

    allaudin@geek ~/Desktop/KotlinLab (master) $ java -jar basics/build/libs/basics.jar 
    Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics
        at com.mallaudin.User.<init>(User.kt)
        at com.mallaudin.App.main(App.java:5)
    Caused by: java.lang.ClassNotFoundException: kotlin.jvm.internal.Intrinsics
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:190)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:499)
        ... 2 more
    
    2 回复  |  直到 6 年前
        1
  •  0
  •   mallaudin    6 年前

    所以,我找到了一个解决办法。在 build.gradle 文件 我已经换了 implementation 配置 compile 现在它开始工作了。我相信它应该和 实施 也是,但不是。现在 jar 看起来像这样

    .
    ├── com
    ├── kotlin
    ├── META-INF
    └── org
    
        2
  •  0
  •   Louis Jacomet    6 年前

    问题在于你如何制造脂肪罐。当你使用最近的和推荐的 implementation 范围为您的依赖项,您只需向fat jar添加 compile 配置。

    您应该将fat jar中使用的配置替换为 runtimeClasspath 它是一整套运行时组件。

    即:

    jar {
      manifest {
        attributes 'Main-Class': 'com.mallaudin.App'
      }
      from {
        configurations.runtimeClasspath.collect {
          it.isDirectory()? it: zipTree(it)
        }
      }
    }  
    

    看一看 the documentation 了解Java项目的不同依赖性配置。