gradle - 运行时出现 NoClassDefFoundError

标签 gradle kotlin

使用 gradle build 构建项目后,我在运行时收到错误“NoClassDefFoundError”。

程序确实启动了,一切似乎都正常,直到它应该读取一些 pdf 文件,然后我收到一个类未找到异常。当我在 intellij 中调试我的应用程序时,一切正常。

当我解压缩 jar 文件时,我确实看到其中不包含 PDFFile.class。奇怪的是,当我在 Linux 上构建相同的项目时,我没有这个问题。

java.lang.NoClassDefFoundError: PDFFile
    at PDFViewModel$loadPdfList$1.invoke(GUI.kt:107)
    at PDFViewModel$loadPdfList$1.invoke(GUI.kt:87)
    at tornadofx.FXTask.call(Lib.kt:219)
    at javafx.concurrent.Task$TaskCallable.call(Task.java:1423)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.ClassNotFoundException: PDFFile
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 6 more

我确实定义了 PDFFile。

data class PDFFile(val path: String, val name: String, var pages: Int?, var progress: Int?)

class PDFViewModel : ItemViewModel<PDFFile>() {
    val pdfFiles = SimpleObjectProperty<ObservableList<PDFFile>>()
    private val files = mutableListOf<PDFFile>()

    fun loadPdfList() {
        files.clear()
        val pdfPath = File(cfg.getProperty("pdf_path"))

        if (pdfPath.isDirectory) {
            val pdfList = pdfPath.listFiles().filter { FilenameUtils.getExtension(it.name).toLowerCase() == "pdf" }
            runAsync {
                // Set progress to 0 just in case directory is empty
                updateProgress(0.0, 1.0)
                if (pdfList.isNotEmpty()) {
                    pdfList.forEachIndexed { index, file ->
                        updateMessage("Loading ${file.name}")
                        // Load basic data about pdf files
                        PDDocument.load(file.absoluteFile).use { document ->
                            files.add(PDFFile(file.absolutePath,
                                    file.nameWithoutExtension,
                                    document.numberOfPages,
                                    0))
                            updateProgress((index + 1.0), pdfList.size.toDouble())
                        }
                    }
                }
            } ui {
                pdfFiles.set(files.observable())
            }
        }
    }
}

在我的 gradle.build 文件中我添加了:

jar {
    manifest {
        attributes 'Implementation-Version': version,
                'Main-Class': 'PDFStripApp'
    }
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
}

最佳答案

我在另一个名为 PdfFile 的文件中有一个类,在 Linux 中,由于文件系统区分大小写,因此没有任何问题。在 Windows 中,PDFFile.classPdfFile.class 是同一件事,因此没有正确地出现在 jar 文件中。

关于gradle - 运行时出现 NoClassDefFoundError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46672242/

相关文章:

java - kotlin kapt3 KaptBaseError: 注释处理时出错::For Room Database

java - 通过gradle构建项目时JVM空间耗尽

java - 更改生产源代码位置

eclipse - Spring项目的初始设置

android - Gradle同步失败:索引2处的字符非法

Kotlin 类型安全构建器

android - Gradle 构建无法在 Android Studio 中查找 Google Play 服务

android - 带有 Android Studio 的 Protobuf

kotlin - Kotlin类型转换int float

android - 我什么时候应该更喜欢顶级 const 与伴随对象 const?