Compiler-Fehler Probleme beim Kompilieren mit Jsoup

BaumGuard

Mitglied
Hallo,
ich habe ein Java-Programm, das die Library Jsoup verwendet, um Informationen von einer Website abzurufen. Wenn ich das Programm in Eclipse kompiliere funktioniert es problemlos. Allerdings funktioniert es nicht richtig, wenn ich es über das Terminal mit javac und jar versuche. Ich muss die Kompilierung mit Kommandozeilenbefehlen machen, weil ich diese für ein Installationsskript brauche.

Der Programmordner hat folgende Inhalte:
  • bin
    • gqthres.class
    • gqthres$1.class
    • gqthres$2.class
    • gqthres$3.class
    • gqthres$4.class
  • src
    • gqthres.java
    • manifest
    • jsoup-1.13.1.jar
  • bin
  • .classpath
  • .project

[CODE lang="java" title="src/manifest"]Main-Class: gqthres
Bundle-ClassPath: ., jsoup-1.13.1.jar[/CODE]


Zum Kompilieren gehe ich in src und führe dort folgende Befehle aus:
Java:
javac -cp jsoup-1.13.1.jar gqthres.java
jar cfm gqthres.jar manifest *.class

Hierbei kommen keine Fehlermeldungen und ich kann die Datei problemlos mit "java -jar gqthres.jar" starten. Sobald ich dort aber eine Funktion verwende, die Jsoup benötigt, bekomme ich diesen Stacktrace:
Java:
Exception in thread "AWT-EventQueue-1" java.lang.NoClassDefFoundError: org/jsoup/Jsoup
        at gqthres.GetCoordinates(gqthres.java:53)
        at gqthres$1.actionPerformed(gqthres.java:379)
        at javax.swing.JTextField.fireActionPerformed(JTextField.java:508)
        at javax.swing.JTextField.postActionEvent(JTextField.java:721)
        at javax.swing.JTextField$NotifyAction.actionPerformed(JTextField.java:836)
        at javax.swing.SwingUtilities.notifyAction(SwingUtilities.java:1668)
        at javax.swing.JComponent.processKeyBinding(JComponent.java:2882)
        at javax.swing.JComponent.processKeyBindings(JComponent.java:2929)
        at javax.swing.JComponent.processKeyEvent(JComponent.java:2845)
        at java.awt.Component.processEvent(Component.java:6316)
        at java.awt.Container.processEvent(Container.java:2239)
        at java.awt.Component.dispatchEventImpl(Component.java:4889)
        at java.awt.Container.dispatchEventImpl(Container.java:2297)
        at java.awt.Component.dispatchEvent(Component.java:4711)
        at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1954)
        at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:834)
        at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:1102)
        at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:973)
        at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:799)
        at java.awt.Component.dispatchEventImpl(Component.java:4760)
        at java.awt.Container.dispatchEventImpl(Container.java:2297)
        at java.awt.Window.dispatchEventImpl(Window.java:2746)
        at java.awt.Component.dispatchEvent(Component.java:4711)
        at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:760)
        at java.awt.EventQueue.access$500(EventQueue.java:97)
        at java.awt.EventQueue$3.run(EventQueue.java:709)
        at java.awt.EventQueue$3.run(EventQueue.java:703)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
        at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:84)
        at java.awt.EventQueue$4.run(EventQueue.java:733)
        at java.awt.EventQueue$4.run(EventQueue.java:731)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:730)
        at org.GNOME.Accessibility.AtkWrapper$6.dispatchEvent(AtkWrapper.java:705)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
Caused by: java.lang.ClassNotFoundException: org.jsoup.Jsoup
        at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
        ... 42 more

Den Quellcode, also gqthres.java, gibt es hier:

Weiß jemand, was ich da falsch mache?
 
Du startest es ohne die jsoup library. Du musst die jsoup Library mit im classpath haben.

Das geht über viele Wege:
- die jsoup jar Datei mit im eigenen jar einbinden (Ein "fat jar" bauen)
- beim start (so wie schon beim compilieren) die jar Datei im classpath mit angeben.
 
Java kennt auch den -cp parameter - also so wie du ihn bei javac angegeben hast, wirst du den parameter auch beim Start mit angeben können.

Und nein - die .classpath Datei ist vom Eclipse Projekt (Vermutlich nutzt Du eclipse. Kann wohl auch von Netbeans sein).

Wenn Du es in Eclipse machen willst, dann kannst Du es in Eclipse richig konfigurieren und auch das jar file entsprechend bauen lassen:

Ansonsten kannst Du das aber auch manuell machen. Du kannst das jar File von jsoup z.B. entpacken und dann die notwendigen Teile mit in Deinem Jar File aufnehmen.
 
In der Regel würde man alles aus dem jar übernehmen. Eine Analyse, welche Teile man ggf weglassen könnte, führt man nicht durch.
 
Ist halt nur die Frage, wie ich Jsoup dann mit Kommandozeilenbefehlen in gqthres.jar reinbekomme. Das scheint ja trotz -cp und der Manifest-Datei nicht richtig zu funktionieren.
 
Dein Manifest ist falsch:
Code:
Main-Class: gqthres
Class-Path: jsoup-1.13.1.jar
sollte funktionieren. Nach dem packen sollte ein java -jar gqthres.jar reichen, wenn jsoup-1.13.1.jar im gleichen Verzeichnis liegt.

EDIT: sehe gerade, dass Du auch keine .class-Files dazupackst, die befinden sich nämlich im bin-Verzeichnis.
 

Neue Themen


Zurück
Oben