У меня есть 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>
Ну, ответ зависит от того, как вы собираетесь создавать свой исполняемый JAR файл. Поскольку вы используете eclipse, я предполагаю, что вы просто экспортировали свой проект.
Сначала... При экспорте всегда выбирайте Runnable JAR файл в качестве типа экспорта при выполнении программы hm-runnable (с основным классом), так как это создаст файл манифеста со всеми соответствующими записями. Наиболее важные записи - это, кстати, запись Main-Class и Class-Path.
Мастер экспорта имеет несколько параметров, с помощью которых вы можете контролировать, что и как действительно экспортируется. Конечно, это также скажется на файле манифеста. Посмотрите на этот снимок экрана:
Вы видите три варианта обработки библиотеки? Позволь мне объяснить:
Самый простой вариант для небольших программ. Это создаст один JAR файл, содержащий все классы (и другие ресурсы) ваших библиотек. Фактически, содержимое всех библиотек извлекается и помещается в экспортированный JAR. Это называется FAT JAR.
Это какая-то другая форма толстого JAR. Все ваши библиотеки помещаются как в сгенерированный файл JAR. То есть ваш сгенерированный JAR содержит ваши классы и ресурсы и все файлы JAR библиотеки. Запуск собственного основного класса теперь не работает, поскольку JAR в JAR не могут быть правильно прочитаны. Поэтому eclipse создает запись Main-Class в файле манифеста, указывающую на класс org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader
. Этот основной класс знает, как загружать содержимое всех упакованных библиотек и запускает ваш собственный основной класс.
Это - я бы сказал - самый профессиональный вариант. Это предпочтительнее для крупных проектов. Созданный JAR файл теперь будет содержать только ваши классы проектов и ресурсы. Кроме того, будет создана подпапка (рядом с вашим JAR), которая содержит всю вашу библиотеку JARS. Файл манифеста вашего JAR теперь должен содержать запись Class-Path, в которой перечислены все эти библиотеки. Это то, о чем просил Джон Скит в своем комментарии. Мастер экспорта создаст эту манифестную запись правильно.
Независимо от того, какой вариант экспорта вы выбираете, вы можете начать свою программу с простого
java -jar ваш -jar файл
Проверьте правильную версию банки. после pdfbox.jar была защита PDFDocument,
[MAVEN] pdfbox-0.6.4.jar
[MAVEN] pdfbox-0.7.1.jar
[MAVEN] pdfbox-0.7.3.jar
банку, которую вы используете, не требуется определение класса.
это проблема с построением пути
Щелкните правой кнопкой мыши project--> щелкните по сборке path--> Настроить сборку path--> Заказ и Export--> и проверить погоду, когда ваша библиотека проверена, если вы не проверите свою библиотеку.
и запустить свой проект
jar
файлы в пути к классам?