【问题标题】:Exception in main thread when executing java jar file执行java jar文件时主线程出现异常
【发布时间】:2014-06-10 16:57:23
【问题描述】:

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

【问题讨论】:

  • 那么,您如何尝试 使 pdfbox jar 文件可用于您的程序?您的清单中有 Class-Path 条目吗?
  • 您是否已将所需的jar 文件添加到您的类路径中?
  • @sankrish 查看我的课程路径
  • @JonSkeet jar 文件是从 eclipse 中导出的..
  • @Ela:您在 Eclipse 中的类路径无关紧要 - 您应该查看 jar 文件中的条目。我不知道 Eclipse 对添加 Class-Path 清单条目做了什么。

标签: java jar classpath manifest pdfbox


【解决方案1】:

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

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

导出向导有一些选项,您可以使用这些选项控制什么以及如何真正导出。当然,这也会对清单文件产生影响。看这个截图:

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

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

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

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

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

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

这是 - 我会说 - 最专业的选择。这对于较大的项目是可取的。生成的 JAR 文件现在将只包含项目的类和资源。此外,将创建一个包含所有库 JARS 的子文件夹(在您的 JAR 旁边)。您的 JAR 清单文件现在必须包含一个列出所有这些库的 Class-Path 条目。这就是 Jon Skeet 在他的评论中所要求的。导出向导将正确创建此清单条目。


无论您选择何种导出选项,您都可以通过简单的方式启动您的程序

java -jar your-jar-file

【讨论】:

  • 不客气。对于您的程序,我建议使用第一个选项。这可能就是你想要的。稍后(很久以后),您将学习如何使用构建工具 - 例如 Apache Maven - 您还可以使用这些工具控制 JAR 创建,包括清单配置。
  • 我收到此警告警告 pdf 文件未关闭。
  • 另一个问题 => 另一个问题。这是您的程序的语义问题。
【解决方案2】:

这是构建路径问题

右键单击项目-->单击构建路径-->配置构建路径-->订购和导出-->并检查是否检查了您的库,如果没有检查您的库。

并运行您的项目

【讨论】:

  • 这可能是单行注释或一般答案。具体
  • 感谢您的回答..我的库已检查。在 Eclipse 中运行时,它工作正常..
  • 在eclipse中已经可以了。我的问题出在 ubuntu 终端上。我想你误解了。
【解决方案3】:

检查正确的 jar 版本。以下 pdfbox.jar 有 PDFDocument 定义,

[MAVEN] pdfbox-0.6.4.jar
[MAVEN] pdfbox-0.7.1.jar
[MAVEN] pdfbox-0.7.3.jar

您使用的 jar 不需要类定义。

【讨论】:

  • 当在 Eclipse 中运行时它工作正常..在终端显示错误的同时运行
猜你喜欢
  • 2017-06-15
  • 2016-09-12
  • 1970-01-01
  • 1970-01-01
  • 2016-11-05
  • 2023-03-19
  • 2012-05-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多