运行时的NoClassDefFoundError

时间:2017-10-10 17:07:41

标签: 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

我确实已经定义了PDF文件。

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) } }
}

1 个答案:

答案 0 :(得分:2)

我在另一个名为PDFFile.class的文件中有一个类,并且在Linux中,因为文件系统区分大小写,所以它没有任何问题。在Windows PdfFile.class<h1>中是相同的,因此没有正确地在jar文件中结束。