执行java jar文件时主线程中的异常

时间:2014-04-25 06:05:11

标签: java jar classpath manifest pdfbox

我有一个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>

3 个答案:

答案 0 :(得分:2)

嗯,答案取决于您将如何创建可运行的JAR文件。当您使用eclipse时,我假设您只是导出您的项目。

首先......导出时,总是选择 Runnable JAR文件作为导出类型,当有一个-hmm - runnable程序(带有主类)时,因为这将创建所有的清单文件适当的条目。顺便说一句,最重要的条目是 Main-Class Class-Path 条目。

导出向导有一些选项,您可以使用这些选项控制 以及 的实际导出方式。当然,这也会对清单文件产生影响。看看这个截图:

enter image description here

您会看到有关库处理的三个选项吗?让我解释一下:

  • 将所需的库提取到生成的JAR

小程序最简单的选择。这将创建一个包含库的所有类(和其他资源)的JAR文件。实际上,提取所有库的内容并将其放入导出的JAR中。这称为 Fat JAR

  • 将所需的库打包到生成的JAR中

这是另一种形式的胖JAR。所有库都将放入生成的JAR文件中。也就是说,生成的JAR包含您的类和资源以及所有库JAR文件。现在开始自己的主类不起作用,因为JAR中的JAR无法正确读取。因此,eclipse在清单文件中创建一个指向类org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader的Main-Class条目。这个主类知道如何加载所有打包库的内容,并启动你自己的主类。

  • 将所需的库复制到生成的JAR旁边的子文件夹

这是 - 我会说 - 最专业的选择。这对于大型项目来说是首选。生成的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没有必要的类定义。