当前位置: 首页 > 知识库问答 >
问题:

运行jar文件时ClassNotFoundException,但在Intellij中运行良好

富波光
2023-03-14

我使用kotlin中的EclipsePAHOMQTT库和IntellijIDE中的Gradle创建了一个小型mqtt应用程序。当通过Intellij运行它时,它运行良好,但是当我构建它并运行创建的jar文件时,我会得到一个NoClassDefFoundError错误。

从我看到的其他问题来看,这似乎与类路径有关,但我不确定如果这确实是问题所在,需要做什么,因为我使用的是gradle而不是jar文件作为库。

我正在学习这个教程

这是我的档案

plugins {
    id 'org.jetbrains.kotlin.jvm' version '1.4.31'
    id 'application'
}

group = 'me.package'
version = '1.0-SNAPSHOT'

repositories {
    mavenCentral()
    maven {
        url "https://repo.eclipse.org/content/repositories/paho-snapshots/"
    }
}

dependencies {
    implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5'
    testImplementation 'org.jetbrains.kotlin:kotlin-test-junit'
}

test {
    useJUnit()
}

compileKotlin {
    kotlinOptions.jvmTarget = '1.8'
}

compileTestKotlin {
    kotlinOptions.jvmTarget = '1.8'
}

application {
    mainClassName = 'com.publisher.MainKt'
}

tasks.jar {
    manifest {
        attributes 'Main-Class': 'com.publisher.MainKt'
    }
    from {
        configurations.compile.collect {
            it.isDirectory() ? it : zipTree(it)
        }
    }
}

还有我的主文件

package com.publisher

import org.eclipse.paho.client.mqttv3.*
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence
import java.io.File

fun main(args: Array<String>) {
    val client = MqttClient("tcp://192.168.0.55:1883","publisher", MemoryPersistence())
    val connOpts = MqttConnectOptions()
    connOpts.isCleanSession = false
    connOpts.isAutomaticReconnect = true

    client.setCallback(object: MqttCallback {

        override fun connectionLost(cause: Throwable?) {
            println("Connection lost")
            println(cause!!.message)
        }

        override fun messageArrived(topic: String?, message: MqttMessage?) {
            println("Message Received for topic: $topic")
            println("Message: ${message!!.payload}")
        }

        override fun deliveryComplete(token: IMqttDeliveryToken?) {
            println("Message delivered")
        }

    })
    try{
        client.connect(connOpts)
        println("Connected")
        client.subscribe("config/+", 1) { topic, message ->
            println("Getting configuration for $message")
            val path = System.getProperty("user.dir")
            val file = File("$path/${message}.json")
            if(file.exists()){
                client.publish("/devices/ + $message + /config", MqttMessage(file.readBytes()))
            }
        }
    }catch (e: MqttException){
        println("Error: ${e.localizedMessage}")
        e.printStackTrace()
    }
} 

共有2个答案

家浩瀚
2023-03-14

你可以考虑影子插件,因为它是直接使用的。您的构建。gradle看起来像这样:

plugins {
    id 'org.jetbrains.kotlin.jvm' version '1.4.31'
    
    // Shadow plugin
    id 'com.github.johnrengelman.shadow' version '6.1.0'
    id 'java'
}

group = 'me.package'
version = '1.0-SNAPSHOT'

repositories {
    mavenCentral()
    maven {
        url "https://repo.eclipse.org/content/repositories/paho-snapshots/"
    }
}

dependencies {
    implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5'
    testImplementation 'org.jetbrains.kotlin:kotlin-test-junit'
}

test {
    useJUnit()
}

compileKotlin {
    kotlinOptions.jvmTarget = '1.8'
}

compileTestKotlin {
    kotlinOptions.jvmTarget = '1.8'
}

application {
    mainClassName = 'com.publisher.MainKt'
}

tasks.jar {
    manifest {
        attributes 'Main-Class': 'com.publisher.MainKt'
    }
}

因此,fat JAR在/build/libs目录中生成,包含所有依赖项。

齐承运
2023-03-14

启动应用程序的方式不包括依赖项,这意味着不包括MQTT驱动程序和Kotlin依赖项。

请执行以下操作:

gradle distZip
# alternatively
gradle distTar

这将创建一个包含所有依赖项和启动脚本的zip/tar文件。使用它来启动应用程序。

 类似资料:
  • 我在Grizzly服务器上为Jersey应用程序运行以下简单示例: 当我从IntelliJ运行它时,一切都按照预期工作。 已连接到目标VM,地址:“127.0.0.1:61163”,传输:“Socket”2016年12月30日4:00:07PM com.sun.jersey.api.core.PackagesResourceConfig init信息:在包中扫描根资源和提供程序类:Applicat

  • 运行hadoop jar文件时出现以下错误 线程“main”java中出现异常。lang.ClassNotFoundException:hdfs: 位于java。网URLClassLoader 1美元。在java上运行(URLClassLoader.java:366) 。网URLClassLoader 1美元。在java上运行(URLClassLoader.java:355) 。安全AccessC

  • 用编译后,我尝试用java运行,它运行了,但随后抛出了一个

  • 我被以下错误困住了。我不知道这是什么类型的错误。我该怎么办?

  • 我是Java和堆栈溢出的新手,我在IntelliJ中创建了一个Java项目,并通过构建工件和构建。jar文件创建了一个。jar文件,以便在不使用IntelliJ的情况下运行该项目。该程序使用一个机器人来打开运行窗口,通过按Windows和R键,移动鼠标到我的计算机的分辨率(1366 x 768)的盒子内部,单击,键入cmd并按回车,移动鼠标到cmd窗口内部,单击,键入whoami并按回车。这在In

  • 问题内容: 如果您在 / myfolder中 有一个名为jar的文件,并且您想使用从中调用的类,那么如何从命令行进行操作呢? 我以为会进入目录然后说,但这不起作用。任何帮助,将不胜感激。 问题答案: 使用。 如果该类不在包中,则只需。 如果您不在所在目录中,则可以执行以下操作: 在Unix或Linux平台上: