# Probleme beim Ausführen einer Java Klasse auf Kommandozeile



## waves (1. Mrz 2007)

hi leute
ich hoffe, hier kann mir jemand weiterhelfen. ich denke, ich weiss wo das problem liegt, nur weiss ich nicht, wie ich es lösen kann 

Ich versuche, über die Kommandozeile eine Javaklasse auszuführen (anmerkung: eine HelloWorld klasse kann ich auf die selbe art und weise erfolgreich ausführen)

ich befinde mich im verzeichnis:
*.../myrss.ch/MyRSS/WEB-INF/classes*

und gebe dies ein, um die java klasse auszuführen:
*java ch/myrss/server/FetchRSSItems*

kriege dann jedoch diesen fehler:
*Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/syndication/io/XmlReader
        at ch.myrss.server.FetchRSSItems.<init>(FetchRSSItems.java:24)
        at ch.myrss.server.FetchRSSItems.main(FetchRSSItems.java:46)
*

die klasse FetchRSSItems erzeugt ein objekt einer anderen Klasse im selben verzeichnis, welche folgende IMPORTS verwendet:
import com.sun.syndication.feed.synd.SyndContent;
import com.sun.syndication.feed.synd.SyndEntry;
import com.sun.syndication.feed.synd.SyndFeed;
import com.sun.syndication.io.SyndFeedInput;
import com.sun.syndication.io.XmlReader;


das java projekt verwendet folgende JAR files, welche sich alle im verzeichnis
*.../myrss.ch/MyRSS/WEB-INF/lib*
befinden:
jdom-1.0.jar
mysql-connector-java-5.0.4-bin.jar
purl-org-content-0.3.jar
rome-0.9.jar


kann mir jemand sagen, was ich genau für einen befehl mit parametern eingeben muss, damit ich die klasse FetchRSSItems erfolgreich ausführen kann? Wenn ich diese Klasse mit Eclipse ausführe, funktionier alles wunderbar, einfach per SSH kann ich es nicht ausführen.

danke schonmals für alle hilfestellungen im voraus.
dominik


----------



## Saxony (1. Mrz 2007)

Hiho,

java hat dir doch schon gesagt woran es liegt:
*
Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/syndication/io/XmlReader 
at ch.myrss.server.FetchRSSItems.<init>(FetchRSSItems.java:24) 
at ch.myrss.server.FetchRSSItems.main(FetchRSSItems.java:46) 
*

Musste mal schauen obs die XmlReader Klasse auch gibt.

bye Saxony


----------



## waves (1. Mrz 2007)

die klasse XmlReader befindet sich im
*rome-0.9.jar*
file, welches im verzeichnis /lib ist

es sollten eigentlich alle klassen dort sein. 

das ganze java projekt ist ein webprojekt für tomcat, wenn ich das ganze über den webbrowser ausführe, dann klappt alles. einfach, wenn ich eine klasse mit SSH direkt ausführen will (was ich tun muss für ein cronjob), dann erhalte ich die oben erwähnte fehlermeldung.


----------



## Der Müde Joe (1. Mrz 2007)

http://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/java.html

musste als option den -cp angeben also deine externen JARS

EDIT:
Der Tomcat guckt automatisch in seinen Shared lib Ordner (oder wie er heisst)
ob da noch externe Jars da sind. Java natürlich nicht


----------



## waves (1. Mrz 2007)

ich habe mal mit der option -cp den pfad zu den JAR files angegeben. 
ausserdem habe ich noch die option VERBOSE gewählt, damit es auflistet, was es alles macht. hier das resultat (es geht leider noch immer nicht)

der befehl:
*[root@clicmetanet2 classes]# java -cp /var/cache/tomcat5/work/PSA/myrss.ch/MyRSS/WEB-INF/lib/ -verbose ch/myrss/server/FetchRSSItems*



> [Opened /usr/lib/jvm/java-1.4.2-sun-1.4.2.07/jre/lib/rt.jar]
> [Opened /usr/lib/jvm/java-1.4.2-sun-1.4.2.07/jre/lib/sunrsasign.jar]
> [Opened /usr/lib/jvm/java-1.4.2-sun-1.4.2.07/jre/lib/jsse.jar]
> [Opened /usr/lib/jvm/java-1.4.2-sun-1.4.2.07/jre/lib/jce.jar]
> ...



wie man in der 4. letzten zeile sehen kann, gibt es noch immer einen fehler:


*Exception in thread "main" java.lang.NoClassDefFoundError: ch/myrss/server/FetchRSSItems*


mache ich da etwas falsch? muss ich direkt die JAR files angeben?


----------



## thE_29 (1. Mrz 2007)

Normalerweise lädt der dir nie via -cp ein Verzeichnis!

Man muss immer die jar Files angeben!


----------



## waves (1. Mrz 2007)

ok danke für den tipp. ich habe dies mal gemacht.

das kommando sieht nun so aus:



> [root@clicmetanet2 classes]# java -cp ../lib/rome-0.9.jar;../lib/jdom-1.0.jar;../lib/mysql-connector-java-5.0.4-bin.jar;../lib/purl-org-content-0.3.jar ch/myrss/server/FetchRSSItems



(CHMOD aller JAR files ist auf 777)

dann gibt es mir das ganze "java usage..." zeugs aus plus dies im anhang:



> bash: ../lib/jdom-1.0.jar: cannot execute binary file
> bash: ../lib/mysql-connector-java-5.0.4-bin.jar: cannot execute binary file
> bash: ../lib/purl-org-content-0.3.jar: cannot execute binary file




nun scheint er die JARs nicht ausführen zu können... gibt es noch tipps? danke!



*UPDATE:*

okay ich habe noch in newsgroups den tipp gefunden, dass ich die einzelnen JARs nicht mit einem semikolon trennen darf und stattdessen einen doppelpunkt verwenden soll. also habe ich das mal umgesetzt:

der befehl sieht nun so aus:


> java -cp ../lib/rome-0.9.jar:../lib/jdom-1.0.jar:../lib/mysql-connector-java-5.0.4-bin.jar:../lib/purl-org-content-0.3.jar ch/myrss/server/FetchRSSItems



allerdings kriege ich nun wieder folgenden fehler:


> Exception in thread "main" java.lang.NoClassDefFoundError: ch/myrss/server/FetchRSSItems



ich weiss wirklich nicht, an was es nun liegen könnte. in der webapplikation über tomcat kann die klasse ohne fehler ausgeführt werden.


----------



## hupfdule (1. Mrz 2007)

> (CHMOD aller JAR files ist auf 777)


Dann mach das mal schnell wieder rückgängig. Die sind nicht ausführbar.




> bash: ../lib/jdom-1.0.jar: cannot execute binary file
> bash: ../lib/mysql-connector-java-5.0.4-bin.jar: cannot execute binary file
> bash: ../lib/purl-org-content-0.3.jar: cannot execute binary file



Das liegt an folgendem: 



> [root@clicmetanet2 classes]# java -cp ../lib/rome-0.9.jar;../lib/jdom-1.0.jar;../lib/mysql-connector-java-5.0.4-bin.jar;../lib/purl-org-content-0.3.jar ch/myrss/server/FetchRSSItems



Da du ein UNIX-System benutzt, trennst du die Jars nicht mit einem Semikolon, sondern einem Doppelpunkt. Das musst du also entsprechend ändern.


----------



## waves (1. Mrz 2007)

@hupfdule:
danke für den tipp. das habe ich zwischenzeitlich auf http://java.sun.com/j2se/1.3/docs/tooldocs/solaris/classpath.html auch gelesen und dementsprechend abgeändert (siehe post oben)
kriege dann aber wieder einen fehler, den ich ganz am anfang schon erhaltne habe  ???:L


----------



## thE_29 (1. Mrz 2007)

Poste mal lieber den Fehler nochmals 

Du hast ganz einfach noch ein jar File vergeseen!


----------



## waves (1. Mrz 2007)

okay ich habe nochmals im LIB ordner geschaut, ich habe noch ein JAR file vergessen.

hier der aktuellste befehl:



> java -cp ../lib/rome-0.9.jar:../lib/jdom-1.0.jar:../lib/mysql-connector-java-5.0.4-bin.jar:../lib/purl-org-content-0.3.jar:../lib/gwt-servlet.jar ch/myrss/server/FetchRSSItems



jetzt habe ich also sämtliche JAR files eingegeben, welche ich im projekt verwende. doch leider gibts die selbe meldung:



> Exception in thread "main" java.lang.NoClassDefFoundError: ch/myrss/server/FetchRSSItems



ich weiss leider net weiter   :cry:


----------



## L-ectron-X (1. Mrz 2007)

Muss es denn nicht





> java -cp ../lib/rome-0.9.jar;../lib/jdom-1.0.jar;../lib/mysql-connector-java-5.0.4-bin.jar;../lib/purl-org-content-0.3.jar;../lib/gwt-servlet.jar;. ch.myrss.server.FetchRSSItems


lauten?

Wenn du unter Linux arbeitest, müssen noch die Trennsemikola gegen Doppelpunkte ausgetauscht werden.
Ich bin mir nur nicht ganz sicher, ob hier überhaupt relative Pfadangaben gemacht werden dürfen.

Versuche, wenn der 1. Vorschlag nicht funktionieren sollte, daher auch mal so was wie:





> java -cp /home/projects/lib/rome-0.9.jar:/home/projects/lib/jdom-1.0.jar:/home/projects/mysql-connector-java-5.0.4-bin.jar:/home/projects/lib/purl-org-content-0.3.jar:/home/projects/lib/gwt-servlet.jar:. ch.myrss.server.FetchRSSItems


(Befehlszeile für Linux)


----------



## waves (1. Mrz 2007)

danke L-ectron-X!

ES LÄUFT  :toll:  
super!!

hast du lediglich einen punkt am ende hinzugefügt? was genau bringt das?


----------



## L-ectron-X (1. Mrz 2007)

Der Punkt zeigt auf das aktuelle Verzeichnis, also jenes in dem man sich gerade befindet. Wird ziemlich oft vergessen...
Außerdem habe den Aufruf der Klasse mit dem qualifizierten Paketnamen gemacht, nicht wie bisher von dir angegeben, mit Slashes für den Verzeichnistrenner.


----------



## waves (1. Mrz 2007)

alles klar! das mit dem punkt kann aber leicht vergessen gehen finde ich.

danke für die unterstützung!


----------



## waves (1. Mrz 2007)

jetzt habe ich doch noch eine frage.

ich kann zwar die klasse aufrufen per SSH, allerdings nur, wenn ich mich im paket-hauptverzeichnis befinde.


wenn ich in diesem verzeichnis bin:



> /var/cache/tomcat5/work/PSA/myrss.ch/MyRSS/WEB-INF/classes



dann funktioniert:



> java -cp /var/cache/tomcat5/work/PSA/myrss.ch/MyRSS/WEB-INF/lib/rome-0.9.jar:
> /var/cache/tomcat5/work/PSA/myrss.ch/MyRSS/WEB-INF/lib/jdom-1.0.jar:
> /var/cache/tomcat5/work/PSA/myrss.ch/MyRSS/WEB-INF/lib/mysql-connector-java-5.0.4-bin.jar:
> /var/cache/tomcat5/work/PSA/myrss.ch/MyRSS/WEB-INF/lib/purl-org-content-0.3.jar:
> /var/cache/tomcat5/work/PSA/myrss.ch/MyRSS/WEB-INF/lib/gwt-servlet.jar:. ch.myrss.server.FetchRSSItems




das ging testweise super, jedoch wollte ich den befehl nun als cronjob erstellen und offensichtlich befindet sich der cronjob in einem anderen verzeichnis. d.h. der obere befehl kann nicht ausgeführt werden. 

die auszuführende klasse befindet sich hier:


> /var/cache/tomcat5/work/PSA/myrss.ch/MyRSS/WEB-INF/classes/ch/myrss/server/FetchRSSItems.class



wie muss ich denn den befehl ändern, damit ich die klasse von jedem x-beliebigen verzeichnis aus starten kann?


----------



## L-ectron-X (1. Mrz 2007)

Probiere mal:


> java -cp .:/var/cache/tomcat5/work/PSA/myrss.ch/MyRSS/WEB-INF/lib/rome-0.9.jar:
> /var/cache/tomcat5/work/PSA/myrss.ch/MyRSS/WEB-INF/lib/jdom-1.0.jar:
> /var/cache/tomcat5/work/PSA/myrss.ch/MyRSS/WEB-INF/lib/mysql-connector-java-5.0.4-bin.jar:
> /var/cache/tomcat5/work/PSA/myrss.ch/MyRSS/WEB-INF/lib/purl-org-content-0.3.jar:
> ...


----------



## waves (1. Mrz 2007)

Perfekt 
Vielen Dank!


----------

