在使用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) } }
}
答案 0 :(得分:2)
我在另一个名为PDFFile.class
的文件中有一个类,并且在Linux中,因为文件系统区分大小写,所以它没有任何问题。在Windows PdfFile.class
和<h1>
中是相同的,因此没有正确地在jar文件中结束。