Исключение в основном потоке при выполнении файла java jar

1

У меня есть 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);

Мой путь к calss подобен

<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>
  • 1
    Ну, как вы пытаетесь сделать файл pdfbox jar доступным для вашей программы? У вас есть запись Class-Path в вашем манифесте?
  • 0
    Вы добавили необходимые jar файлы в пути к классам?
Показать ещё 8 комментариев
Теги:
jar
manifest
pdfbox
classpath

3 ответа

2
Лучший ответ

Ну, ответ зависит от того, как вы собираетесь создавать свой исполняемый JAR файл. Поскольку вы используете eclipse, я предполагаю, что вы просто экспортировали свой проект.

Сначала... При экспорте всегда выбирайте Runnable JAR файл в качестве типа экспорта при выполнении программы hm-runnable (с основным классом), так как это создаст файл манифеста со всеми соответствующими записями. Наиболее важные записи - это, кстати, запись Main-Class и Class-Path.

Мастер экспорта имеет несколько параметров, с помощью которых вы можете контролировать, что и как действительно экспортируется. Конечно, это также скажется на файле манифеста. Посмотрите на этот снимок экрана:

Изображение 174551

Вы видите три варианта обработки библиотеки? Позволь мне объяснить:

  • Извлечение необходимых библиотек в созданный JAR

Самый простой вариант для небольших программ. Это создаст один JAR файл, содержащий все классы (и другие ресурсы) ваших библиотек. Фактически, содержимое всех библиотек извлекается и помещается в экспортированный JAR. Это называется FAT JAR.

  • Пакет требует библиотеки в сгенерированный JAR

Это какая-то другая форма толстого JAR. Все ваши библиотеки помещаются как в сгенерированный файл JAR. То есть ваш сгенерированный JAR содержит ваши классы и ресурсы и все файлы JAR библиотеки. Запуск собственного основного класса теперь не работает, поскольку JAR в JAR не могут быть правильно прочитаны. Поэтому eclipse создает запись Main-Class в файле манифеста, указывающую на класс org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader. Этот основной класс знает, как загружать содержимое всех упакованных библиотек и запускает ваш собственный основной класс.

  • Скопируйте необходимые библиотеки в подпапку рядом с созданным JAR

Это - я бы сказал - самый профессиональный вариант. Это предпочтительнее для крупных проектов. Созданный JAR файл теперь будет содержать только ваши классы проектов и ресурсы. Кроме того, будет создана подпапка (рядом с вашим JAR), которая содержит всю вашу библиотеку JARS. Файл манифеста вашего JAR теперь должен содержать запись Class-Path, в которой перечислены все эти библиотеки. Это то, о чем просил Джон Скит в своем комментарии. Мастер экспорта создаст эту манифестную запись правильно.


Независимо от того, какой вариант экспорта вы выбираете, вы можете начать свою программу с простого

java -jar ваш -jar файл

  • 0
    действительно хороший ...
  • 1
    Пожалуйста. Для вашей программы я предлагаю использовать первый вариант. Это, вероятно, то, что вы хотите. Позже (намного позже) вы узнаете, как использовать инструменты сборки, такие как Apache Maven, с помощью которых вы также управляете созданием JAR, включая конфигурацию манифеста.
Показать ещё 3 комментария
0

Проверьте правильную версию банки. после pdfbox.jar была защита PDFDocument,

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

банку, которую вы используете, не требуется определение класса.

  • 0
    При запуске в Eclipse все работает нормально. Время запуска в терминале показывает ошибку
  • 0
    если вы получаете больше ошибок, то напишите новый вопрос
Показать ещё 1 комментарий
0

это проблема с построением пути

Щелкните правой кнопкой мыши project--> щелкните по сборке path--> Настроить сборку path--> Заказ и Export--> и проверить погоду, когда ваша библиотека проверена, если вы не проверите свою библиотеку.

и запустить свой проект

  • 0
    это может быть однострочный комментарий или общий ответ. быть конкретной
  • 0
    Спасибо за ваш ответ .. мои библиотеки проверены. При запуске в затмении работает нормально ..
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню