Cronjob + Java

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Majestic
Beiträge: 557
Registriert: 06.08.2003 17:04:15
Wohnort: Dortmund

Cronjob + Java

Beitrag von Majestic » 11.12.2003 22:59:11

Hi,

wieder ich ;)

Ums kurz zu machn, ich moechte per CronJob meine java "programm" starten.

Problem: Cron moechte das nicht :(

Ja.. was tun?



Der Befehl "java" alleine kennt er gar nicht. und wenn ich /opt/java/bin/java mache bekomm ich nur ne fehlermeldung, wobei das Programm laeuft wenn ich es so in die konsole tippe.

Jemand ne idee?

Danke
Sven
System
Debian 4.0 "Etch"
Kernel 2.6.18
Gnome 2.6

Benutzeravatar
emge
Beiträge: 1525
Registriert: 20.10.2003 22:05:46
Lizenz eigener Beiträge: Artistic Lizenz
Wohnort: 50° 45' 0" N 12° 10' 0" E

Beitrag von emge » 11.12.2003 23:00:36

Sagst du auch die Fehlermeldung?

Grüße, Marco

Majestic
Beiträge: 557
Registriert: 06.08.2003 17:04:15
Wohnort: Dortmund

Beitrag von Majestic » 11.12.2003 23:02:55

Ich habs geahnt ;)

War nur zu faul ;)

ne.. also hier kommt sie
Ausgabe des Befehls cd /home/sven/CheckMail ; /opt/java/bin/java mail ...

Exception in thread "main" java.lang.NoClassDefFoundError
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:141)
at java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:62)
at sun.awt.motif.MToolkit.<clinit>(MToolkit.java:81)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:141)
at java.awt.Toolkit$2.run(Toolkit.java:748)
at java.security.AccessController.doPrivileged(Native Method)
at java.awt.Toolkit.getDefaultToolkit(Toolkit.java:739)
at javax.swing.ImageIcon.<init>(ImageIcon.java:205)
at javax.swing.LookAndFeel$1.createValue(LookAndFeel.java:274)
at javax.swing.UIDefaults.getFromHashtable(UIDefaults.java:181)
at javax.swing.UIDefaults.get(UIDefaults.java:126)
at javax.swing.MultiUIDefaults.get(MultiUIDefaults.java:44)
at javax.swing.UIDefaults.getIcon(UIDefaults.java:407)
at javax.swing.UIManager.getIcon(UIManager.java:537)
at javax.swing.plaf.basic.BasicOptionPaneUI.getIconForType(BasicOptionPaneUI.java:557)
at javax.swing.plaf.basic.BasicOptionPaneUI.getIcon(BasicOptionPaneUI.java:543)
at javax.swing.plaf.basic.BasicOptionPaneUI.createMessageArea(BasicOptionPaneUI.java:313)
at javax.swing.plaf.basic.BasicOptionPaneUI.installComponents(BasicOptionPaneUI.java:154)
at javax.swing.plaf.basic.BasicOptionPaneUI.installUI(BasicOptionPaneUI.java:122)
at javax.swing.JComponent.setUI(JComponent.java:449)
at javax.swing.JOptionPane.setUI(JOptionPane.java:1693)
at javax.swing.JOptionPane.updateUI(JOptionPane.java:1715)
at javax.swing.JOptionPane.<init>(JOptionPane.java:1678)
at javax.swing.JOptionPane.showOptionDialog(JOptionPane.java:828)
at javax.swing.JOptionPane.showMessageDialog(JOptionPane.java:642)
at javax.swing.JOptionPane.showMessageDialog(JOptionPane.java:613)
at javax.swing.JOptionPane.showMessageDialog(JOptionPane.java:584)
at mail.main(mail.java:7)
System
Debian 4.0 "Etch"
Kernel 2.6.18
Gnome 2.6

Benutzeravatar
suntsu
Beiträge: 2947
Registriert: 03.05.2002 10:45:12
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: schweiz
Kontaktdaten:

Beitrag von suntsu » 11.12.2003 23:04:41

Kannst du das Programm von Hand ausführen?
Wenn ja musst du vielleicht noch den Classpath setzen.

gruss
manuel

Majestic
Beiträge: 557
Registriert: 06.08.2003 17:04:15
Wohnort: Dortmund

Beitrag von Majestic » 11.12.2003 23:05:58

suntsu hat geschrieben:Kannst du das Programm von Hand ausführen?
Wenn ja musst du vielleicht noch den Classpath setzen.

gruss
manuel
Ja von hand funzt es.

Wie setzt ich denn den Classpath?
System
Debian 4.0 "Etch"
Kernel 2.6.18
Gnome 2.6

Benutzeravatar
suntsu
Beiträge: 2947
Registriert: 03.05.2002 10:45:12
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: schweiz
Kontaktdaten:

Beitrag von suntsu » 11.12.2003 23:12:57

Ein

Code: Alles auswählen

java -help
hilft weiter.
Ich würde einfach mal

Code: Alles auswählen

java -classpath /dort/wo/dein/javafile/liegt
probieren.

Bei "normalem" ausführen von Java spielt der Classpath seit java1.2 imo keine Rolle mehr. Ich weis ned wie das bei cron genau aussieht.

Must halt bescheid sagen ob es geht :twisted:

gruss
manuel

edit:
Zudem kann ich dir noch dieses Buch empfelen. http://www.galileocomputing.de/openbook ... #Xxx537584
Zuletzt geändert von suntsu am 11.12.2003 23:17:07, insgesamt 1-mal geändert.

Benutzeravatar
emge
Beiträge: 1525
Registriert: 20.10.2003 22:05:46
Lizenz eigener Beiträge: Artistic Lizenz
Wohnort: 50° 45' 0" N 12° 10' 0" E

Beitrag von emge » 11.12.2003 23:14:01

Ich vermute auch ein Classpath-Problem. Unter welchem User wird der Cron-Job ausgeführt? Ich vermute, wenn du das Programm von Hand ausführst, dann ist dei Classpath-Variable schon im Environment gesetzt. Der Cron-Job bekommt davon nichts mit.

Schau mal mit

Code: Alles auswählen

set | grep CLASSPATH
ob einer gesetzt ist. Wenn ja, dann musst du den Aufruf im Cron-Job mit

Code: Alles auswählen

 java -cp lib1.jar:...:libN.jar package.klasse
anpassen.

Grüße, Marco

Benutzeravatar
emge
Beiträge: 1525
Registriert: 20.10.2003 22:05:46
Lizenz eigener Beiträge: Artistic Lizenz
Wohnort: 50° 45' 0" N 12° 10' 0" E

Beitrag von emge » 11.12.2003 23:17:12

suntsu hat geschrieben:Bei "normalem" ausführen von Java spielt der Classpath seit java1.2 imo keine Rolle mehr.
Hä? Seit wann denn das? Hab ich was verpasst? Was meinst du mit "normalem Ausführen"? Die benötigten Bibliotheken und Klassen müssen immer noch ordentlich im Classpath stehen.

Grüße, Marco

Benutzeravatar
suntsu
Beiträge: 2947
Registriert: 03.05.2002 10:45:12
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: schweiz
Kontaktdaten:

Beitrag von suntsu » 11.12.2003 23:19:17

emge hat geschrieben:Ich vermute auch ein Classpath-Problem. Unter welchem User wird der Cron-Job ausgeführt? Ich vermute, wenn du das Programm von Hand ausführst, dann ist dei Classpath-Variable schon im Environment gesetzt. Der Cron-Job bekommt davon nichts mit.
Grüße, Marco
Das denke ich auch. Normalerweise ist ja der classpath schon mit dem . (punkt) auf das aktuelle Verzeichniss gesetzt. Aba ich weis halt wie gesagt nicht wie sich da der cron verhällt.

gruss

ps: Jetzt ist bei mir "Webanwendungen entwickeln mit Oracle9i" eingetroffen, mal sehen ob es hilft :)

Majestic
Beiträge: 557
Registriert: 06.08.2003 17:04:15
Wohnort: Dortmund

Beitrag von Majestic » 11.12.2003 23:20:57

emge hat geschrieben:
suntsu hat geschrieben:Bei "normalem" ausführen von Java spielt der Classpath seit java1.2 imo keine Rolle mehr.
Hä? Seit wann denn das? Hab ich was verpasst? Was meinst du mit "normalem Ausführen"? Die benötigten Bibliotheken und Klassen müssen immer noch ordentlich im Classpath stehen.

Grüße, Marco
lol, ihr beide seid heute abend aber gut drauf, ne? :D
System
Debian 4.0 "Etch"
Kernel 2.6.18
Gnome 2.6

Benutzeravatar
suntsu
Beiträge: 2947
Registriert: 03.05.2002 10:45:12
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: schweiz
Kontaktdaten:

Beitrag von suntsu » 11.12.2003 23:22:19

emge hat geschrieben:
suntsu hat geschrieben:Bei "normalem" ausführen von Java spielt der Classpath seit java1.2 imo keine Rolle mehr.
Hä? Seit wann denn das? Hab ich was verpasst? Was meinst du mit "normalem Ausführen"? Die benötigten Bibliotheken und Klassen müssen immer noch ordentlich im Classpath stehen.

Grüße, Marco
Ich zitiere nur von Büchern *g*
java ist auch eine Insel hat geschrieben:Als Parameter für den Interpreter wird der Name der Klasse übergeben, die eine main()-Funktion enthält und somit als ausführbar gilt. Der Dateiname ist daher auch nicht mit der Endung »class« zu versehen, denn es gibt keine Klasse mit dem Namen Quadrat.class. Scheitert die Ausführung des Programms an dem Problem, dass die Klasse nicht verfügbar ist, so muss möglicherweise in die Umgebungsvariable CLASSPATH der Punkt (das aktuelle Verzeichnis) mit aufgenommen werden. Ab dem SDK 1.2 ist der CLASSPATH allerdings für die Standardausführung nicht nötig und sollte besser gar nicht gesetzt werden.
gruss
manuel

edit:
Mit "normalem" ausführen meinte ich java Classe, wie schon geschreiben habe ich keinen schimmer wie sich cron da verhält.

Benutzeravatar
emge
Beiträge: 1525
Registriert: 20.10.2003 22:05:46
Lizenz eigener Beiträge: Artistic Lizenz
Wohnort: 50° 45' 0" N 12° 10' 0" E

Beitrag von emge » 11.12.2003 23:45:03

suntsu hat geschrieben:
emge hat geschrieben:
suntsu hat geschrieben:Bei "normalem" ausführen von Java spielt der Classpath seit java1.2 imo keine Rolle mehr.
Hä? Seit wann denn das? Hab ich was verpasst? Was meinst du mit "normalem Ausführen"? Die benötigten Bibliotheken und Klassen müssen immer noch ordentlich im Classpath stehen.

Grüße, Marco
Ich zitiere nur von Büchern *g*
java ist auch eine Insel hat geschrieben:Als Parameter für den Interpreter wird der Name der Klasse übergeben, die eine main()-Funktion enthält und somit als ausführbar gilt. Der Dateiname ist daher auch nicht mit der Endung »class« zu versehen, denn es gibt keine Klasse mit dem Namen Quadrat.class. Scheitert die Ausführung des Programms an dem Problem, dass die Klasse nicht verfügbar ist, so muss möglicherweise in die Umgebungsvariable CLASSPATH der Punkt (das aktuelle Verzeichnis) mit aufgenommen werden. Ab dem SDK 1.2 ist der CLASSPATH allerdings für die Standardausführung nicht nötig und sollte besser gar nicht gesetzt werden.
gruss
manuel

edit:
Mit "normalem" ausführen meinte ich java Classe, wie schon geschreiben habe ich keinen schimmer wie sich cron da verhält.
Aha. Stimmt.

Aber nur, wenn du den Classpath nicht noch beim Aufruf mit angeben musst. Dann wird der implizit gesetze Classpath (aktuelles Verzeichnis) nicht mit gesetzt. Muss dann also "per Hand" wieder angefügt werden.

Die allgemeingülte und immer funktionierende Variante ist dann doch wieder, immer den Classpath beim Aufruf mit zu setzen (erfahrungsgemäss braucht man sowieso immer noch irgendwelche Bibliotheken). Dann funktioniert das auch mit dem Cron-Job.

Grüße, Marco

Majestic
Beiträge: 557
Registriert: 06.08.2003 17:04:15
Wohnort: Dortmund

Beitrag von Majestic » 11.12.2003 23:45:59

emge hat geschrieben:Ich vermute auch ein Classpath-Problem. Unter welchem User wird der Cron-Job ausgeführt? Ich vermute, wenn du das Programm von Hand ausführst, dann ist dei Classpath-Variable schon im Environment gesetzt. Der Cron-Job bekommt davon nichts mit.

Schau mal mit

Code: Alles auswählen

set | grep CLASSPATH
ob einer gesetzt ist. Wenn ja, dann musst du den Aufruf im Cron-Job mit

Code: Alles auswählen

 java -cp lib1.jar:...:libN.jar package.klasse
anpassen.

Grüße, Marco
unter User "sven"

so... ich probier das mit den classpath morgen mal aus, muss jetzt ins bett ;)

aber ich sach schonmal danke ;)

gn8
sven
System
Debian 4.0 "Etch"
Kernel 2.6.18
Gnome 2.6

Antworten