我有一个java jar文件,我在ubuntu终端执行时遇到错误。
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/pdfbox/pdmodel/PDDocument
at com.example.pdfbox.pdfbox.main(pdfbox.java:41)
Caused by: java.lang.ClassNotFoundException: org.apache.pdfbox.pdmodel.PDDocument
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
... 1 more
我的代码就像:
package com.example.pdfbox;
import java.io.BufferedWriter;
import java.io.File;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDDocumentCatalog;
import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm;
import org.apache.pdfbox.util.PDFTextStripper;
public class pdfbox {
public static void main(String[] args) {
PDDocument pd;
BufferedWriter wr;
String kunde = args[0];
String sted = args[1];
String plassering = args[2];
try {
File input = new File("/home/processdrive/Desktop/SKI108RE.PDF");
pd = PDDocument.load(input);// line number 41
System.out.println(pd.getNumberOfPages());
System.out.println(pd.isEncrypted());
PDDocumentCatalog catalog = pd.getDocumentCatalog();
PDAcroForm form = catalog.getAcroForm();
form.getField("Kunde").setValue(kunde);
form.getField("Sted").setValue(sted);
form.getField("Plassering").setValue(plassering);
pd.save("/home/processdrive/Desktop/CopyOfInvoice.pdf");
PDFTextStripper stripper = new PDFTextStripper();
stripper.setStartPage(1);
stripper.setEndPage(1);
} catch (Exception e){
e.printStackTrace();
System.out.println("Error occured");
}
}
}
41行是
pd = PDDocument.load(input);
我的路径就像
<classpath><classpathentry kind="src" path="src"/>
<classpathentry exported="true" kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
<classpathentry exported="true" kind="lib" path="/home/processdrive/Desktop/pdfbox/pdfbox-1.8.4.jar"/>
<classpathentry exported="true" kind="lib" path="/home/processdrive/Desktop/pdfbox/commons-logging-1.1.1.jar"/>
<classpathentry exported="true" kind="lib" path="/home/processdrive/Desktop/pdfbox/fontbox-1.8.4.jar"/>
<classpathentry kind="output" path="bin"/>
</classpath>
答案 0 :(得分:2)
嗯,答案取决于您将如何创建可运行的JAR文件。当您使用eclipse时,我假设您只是导出您的项目。
首先......导出时,总是选择 Runnable JAR文件作为导出类型,当有一个-hmm - runnable程序(带有主类)时,因为这将创建所有的清单文件适当的条目。顺便说一句,最重要的条目是 Main-Class 和 Class-Path 条目。
导出向导有一些选项,您可以使用这些选项控制 以及 的实际导出方式。当然,这也会对清单文件产生影响。看看这个截图:
您会看到有关库处理的三个选项吗?让我解释一下:
小程序最简单的选择。这将创建一个包含库的所有类(和其他资源)的JAR文件。实际上,提取所有库的内容并将其放入导出的JAR中。这称为 Fat JAR 。
这是另一种形式的胖JAR。所有库都将按放入生成的JAR文件中。也就是说,生成的JAR包含您的类和资源以及所有库JAR文件。现在开始自己的主类不起作用,因为JAR中的JAR无法正确读取。因此,eclipse在清单文件中创建一个指向类org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader
的Main-Class条目。这个主类知道如何加载所有打包库的内容,并启动你自己的主类。
这是 - 我会说 - 最专业的选择。这对于大型项目来说是首选。生成的JAR文件现在只包含项目的类和资源。此外,还将创建一个包含所有库JARS的子文件夹(JAR旁边)。现在,JAR的清单文件必须包含列出所有这些库的Class-Path条目。这就是Jon Skeet在评论中所要求的。导出向导将正确创建此清单条目。
无论您选择哪种导出选项,您都可以使用简单的
启动程序java -jar your-jar-file
答案 1 :(得分:0)
这是构建路径问题
右键单击项目 - &gt;单击构建路径 - &gt;配置构建路径 - &gt;订单和导出 - &gt;如果没有检查你的图书馆,检查你的图书馆的天气。
并运行您的项目
答案 2 :(得分:0)
检查适当的jar版本。以下pdfbox.jar有PDFDocument defination,
[MAVEN] pdfbox-0.6.4.jar
[MAVEN] pdfbox-0.7.1.jar
[MAVEN] pdfbox-0.7.3.jar
你正在使用的jar没有必要的类定义。