# Per BatchScript Mail versenden



## BatchJavaMail (7. Jan 2011)

Guten Morgen Zusammen,

ich wollte mal Fragen kann ich wenn ich durch ein Batchscript also blubb.bat eine Mail versenden.
Wenn ich mein Programm mit Eclipse ausführe funtioniert das Mailversenden wunderbar, aber sobald ich es mit dem Batch probiere kommt folgender Fehler.

Meine .bat sieht so aus: 

```
@ECHO OFF
cd \
cd workspace
cd xmlparser
cd bin
java main 
pause
```

Fehler:

```
java.lang.NoClassDefFoundError: javax/mail/Adresse
```
Ok das bedeutet also das er die Klasse nicht finden kann, aber warum findet mein Eclipse diese? 

Grüße und Danke für die Hilfe.


----------



## homer65 (7. Jan 2011)

NoClassDefFoundError heißt das eine Java Klasse (javax/mail/Adresse) nicht gefunden wurde.
Wo ist denn die? Vielleicht in einer beiliegenden .jar Datei?
Dann mußt du den Pfad zur .jar Datei per CLASSPATH Variable angeben.
Zum Beispiel:
set CLASSPATH=%CLASSPATH%;mail.jar
Wenn die .jar Datei mail.jar heißt.


----------



## lender (10. Jan 2011)

also dann so?

set CLASSPATH=C:\workspace\xmlparser\lib;mail.jar

danke schonmal!


----------



## akchill (10. Jan 2011)

....
ich habs nochmal versucht das klappt nicht.


```
@ECHO OFF
set CLASSPATH=%CLASSPATH%;jdom.jar dsn.jar imap.jar mailapi.jar pop3.jar smtp.jar
cd \
cd workspace
cd rser
cd bin
java main 
pause
```


----------



## bygones (10. Jan 2011)

zum einen.. warum in jeder zeile n cd und nicht einfach [c]cd \workspace\rser\bin[/c] ?
weiterhin wuerde ich beim Aufruf von java den classpath setzen - außerdem ist nicht das Leerzeichnen n trenner unter windows sondern ;

also 

```
....
java -cp .;lib1.jar;lib2.jar;lib3.jar main
```


----------



## akchill (10. Jan 2011)

also ich weis nicht ob die richtig eingebunden sind, ich versuch mal so zu erklären der fehler kommt aufjeden fall noch.

habe mein Projekt ordner, dann in src liegt meine main klasse. desweiteren liegt im Projektordner ein Lib ordner in der meine Jar´s liegen. 

oder muss ich die jars in den src ordner legen?!

java -cp .;dsn.jar;jdom.jar;pop3.jar;smtp.jar;mailapi.jar;imap.jar main


----------



## akchill (10. Jan 2011)

oder vllt ist das einfacher zu verstehen einfach ein jar zu bauen?!

habe eine einleitung hier im forum gefunden und versucht die nach zu bauen, funktioniert aber auch nicht. vllt kannst du damit was anfangen und mir helfen


```
@echo off
echo JarBatch - erzeugen von jar-Dateien

set path=.;C:\Programme\Java\jdk1.6.0_22\bin

rem * Manifestdatei vorbereiten und erzeugen.
echo Manifest-Version: 1.0>manifest.mf

rem --> anpassen!
rem * Bitte ClassPath hier angeben! Der Class-Path enthält eine Auflistung externer Jar-Dateien (optional)
rem * Beispiel: Class-Path: ./lib/h2.jar ./lib/icons.jar
echo Class-Path: C:\workspace\rser\lib\dsn.jar C:\workspace\rser\lib\imap.jar C:\workspace\rser\lib\jdom.jar C:\workspace\arser\lib\pop3.jar C:\workspace\rser\lib\mailapi.jar C:\workspace\rser\lib\smtp.jar>>manifest.mf

rem --> anpassen!
rem * Bitte Image für Splashscreen hier angeben! (optional)
echo Splashscreen-Image: splash.png>>manifest.mf

rem --> anpassen!
rem * Bitte Main-Class hier angeben! (Die Klasse mit der main()-Methode)
rem * Wenn die Main-Class in einem Package liegt, muss es mit angegeben werden.
echo Main-Class: C:\workspace\rser\src\main.java>>manifest.mf

rem * Abschließende Leerzeile nicht vergessen!
echo.>>manifest.mf

if exist *.class goto create

rem * Kompilieren, falls noch nicht geschehen.
:compile
if not exist *.java goto errorjava
javac -O *.java

rem * Jar-Datei erzeugen.
:create
if not exist *.class goto errorjar
rem --> anpassen!
rem * Anwendungsbeispiel: jar cfvm ArchivName.jar manifest.mf *.class images sounds
rem * würde ein Manifest, alle class-Dateien und die Verzeichnisse images und sounds in ein eine Jar-Datei namens ArchivName.jar einfügen.
rem * Bitte Name der zu erstellenden jar-Datei hier angeben!
jar cfvm MeinProgramm.jar manifest.mf MeinPackage
echo Entsprechende Dateien wurden dem jar-Archiv hinzugefügt.
goto end

:errorjava
echo java-Dateien nicht gefunden!
echo class-Dateien konnten nicht erstellt werden.

:errorjar
echo class-Dateien konnten nicht gefunden werden!
echo jar-Archiv konnte nicht erstellt werden.

:end
rem * Manifest von Festplatte löschen
del manifest.mf

rem * Konsole für Ausgaben geöffnet lassen
echo.
pause
```


----------



## homer65 (10. Jan 2011)

akchill hat gesagt.:


> also ich weis nicht ob die richtig eingebunden sind, ich versuch mal so zu erklären der fehler kommt aufjeden fall noch.
> 
> habe mein Projekt ordner, dann in src liegt meine main klasse. desweiteren liegt im Projektordner ein Lib ordner in der meine Jar´s liegen.
> 
> ...



Sicher wäre es für jedes jar den kompletten Pfad anzugeben. Mal ein Beispiel:
set ICONEDITOR=C:\IconEditor
set CLASSPATH=%CLASSPATH%;%ICONEDITOR%\IconEditor.jar
set CLASSPATH=%CLASSPATH%;%ICONEDITOR%\image4j.jar


----------



## akchill (11. Jan 2011)

So jetzt funktioniert mein Batch, jetzt wollen sie es doch auf Linux laufen lassen. Die machen mich fertig. Habe mich dort auch mal eingelesen aber das scheint noch komplizierter 

@ECHO OFF
set lib=C:\workspace\ser\lib
set CLASSPATH=%CLASSPATH%;%lib%\dsn.jar
set CLASSPATH=%CLASSPATH%;%lib%\jdom.jar
set CLASSPATH=%CLASSPATH%;%lib%\pop3.jar
set CLASSPATH=%CLASSPATH%;%lib%\smtp.jar
set CLASSPATH=%CLASSPATH%;%lib%\mailapi.jar
set CLASSPATH=%CLASSPATH%;%lib%\imap.jar
cd \
cd workspace
cd ser
cd bin
java main 
pause


----------



## bygones (11. Jan 2011)

musst halt nun eine sh Datei schreiben... 

```
export lib=C:\workspace\ser\lib // unix pfad eintragen
export CLASSPATH=$CLASSPATH:$lib\dsn.jar:$lib\jdom.jar:.... // und alle anderen per : anhängen
cd /workspace/ser/bin
java main
```

als simples skript... [c]export[/c] je nach installation kann auch set sein


----------



## akchillo (11. Jan 2011)

ich hab so ein Shell script fertig geschrieben... 

export PATH=$PATH:/data/ser/lib/dsn.jar 
export PATH=$PATH:/data/rser/lib/jdom.jar
export PATH=$PATH:/data/rser/lib/pop3.jar
export PATH=$PATH:/data/rser/lib/smtp.jar
export PATH=$PATH:/data/rser/lib/mailapi.jar
export PATH=$PATH:/data/rser/lib/imap.jar

#cd /data/rser/bin
/data/rser/src/main.java
sleep 5

das problem ist nur wenn ich das ausführe, fliegen mir alle Imports direkt in der Main methode und er fängt sie garnicht mal an zu starten. also er liesst imports und fliegt dann raus...


----------



## akchillo (11. Jan 2011)

könnte es an der version liegen?

Auf dem Rechner 1.6.22 und auf dem Server 1.6.20


----------



## bygones (11. Jan 2011)

Path != classpath.


----------



## akchillo (11. Jan 2011)

tut mir leid das ic hnerve
aber bei diesem Script funktionieren die Imports auch nicht. Die fliege ndirekt als fehlermeldung, konnte nicht gefunden werden. 
Und das sind nicht mal die Lib´s die ich eingebunden habe, ich glaube eher das es die Standartlib´s von java sind.

export lib=/data/ser/lib/
export CLASSPATH=$CLASSPATH:$lib\dsn.jar:$lib\jdom.jar:$lib\pop3.jar:$lib\smtp.jar:$lib\mailapi.jar:$lib\imap.jar:
#cd /data/rser/bin

/data/rser/src/main.java

sleep 5


----------



## bygones (11. Jan 2011)

```
#!/bin/bash

[[ ! -x `which java` ]] &&
    echo "Missing java, aborting ..." &&
    exit 1

cd /workspace/ser/bin # korrekter pfad eintragen

LIB_DIR=/path/to/libs
java -cp .:$LIB_DIR/lib1.jar:$LIB_DIR/lib2.jar main
```

ansonsten poste mal was java so ausspuckt

edit:
du kannst dir auch den Classpath mit allen jars in einem dir bauen lassen

```
CLASS_PATH="."
for lib in `ls /path/to/libs/*.jar`
do
    CLASS_PATH=$CLASS_PATH:$lib
done

java -cp $CLASS_PATH main
```


----------



## homer65 (11. Jan 2011)

akchillo hat gesagt.:


> /data/rser/src/main.java



So startet man kein Java Programm.

Hier mal ein Beispiel von mir:

```
#!/bin/bash
#
CLASSPATH=$CLASSPATH:/home/christian/JMyScanner/lib/JMyScanner.jar
CLASSPATH=$CLASSPATH:/home/christian/JMyScanner/lib/mysql-connector-java-5.1.10-bin.jar
export CLASSPATH
java main.Main /home/christian/JMyScanner/JMyScanner.ini
exit $?
```


----------



## JohannisderKaeufer (12. Jan 2011)

akchill hat gesagt.:


> oder vllt ist das einfacher zu verstehen einfach ein jar zu bauen?!



Ich denke mit dem jar, hättest du dir das ein oder andere Aspirin ersparen können.

Ein Jar ist nicht viel mehr als ein Zip-Archiv mit der Endung jar in dem deine .class Dateien liegen.
Eine Jar hat zudem noch einen Ordner META-INF indem eine MANIFEST.MF liegt.

In der Manifest datei steht dann in welcher klasse die Main-Methode ist


```
Main-Class: MyPackage.MyClass
```

und welche zusätzlichen libs gebraucht werden


```
Class-Path: jar1-name.jar jar2-name directory-name/jar3-name
```

Wobei diese Angaben relativ zum jarfile sind. D.h. jar1-name.jar ist im Gleichen Verzeichnis wie MeineAnwendung.jar

Gestartet wird eine jar üblicherweise durch


```
java -jar MeineAnwendung.jar
```

oder per Doppelklick.


----------



## JohannisderKaeufer (12. Jan 2011)

JohannisderKaeufer hat gesagt.:


> Ich denke mit dem jar, hättest du dir das ein oder andere Aspirin ersparen können.
> 
> Ein Jar ist nicht viel mehr als ein Zip-Archiv mit der Endung jar in dem deine .class Dateien liegen.
> Eine Jar hat zudem noch einen Ordner META-INF indem eine MANIFEST.MF liegt.
> ...



Und mit einem Ant-Skript lässt sich das Erstellen eines jars auch noch automatisieren.
Wenn am Schluß eine einzelne jar Datei rauskommen soll in der alle Abhängigen jars enthalten sind, kann man auch ein Programm wie Fat Jar benutzen (Lizenzen beachten). Fat jar entpackt alle in jars enthaltenen class Dateien und fügt sie in ein gemeinsames jar. Somit bleibt eine Datei übrig in der alles enthalten ist.


----------



## akchillo (12. Jan 2011)

Ok. Ein Jar hätte wirklich eventuell alles einfacher gelöst. Muss mic hdazu nochmal genau informieren. Aber habe das jetzt probiert wie Homer es als Beispiel gezeigt hat, nur was ist die .ini datei bei dem Main aufruf?! 

CLASSPATH=$CLASSPATH:/data/ser/lib/dsn.jar 
CLASSPATH=$CLASSPATH:/data/ser/lib/jdom.jar
CLASSPATH=$CLASSPATH:/data/ser/lib/pop3.jar
CLASSPATH=$CLASSPATH:/data/ser/lib/jdom.jar
CLASSPATH=$CLASSPATH:/data/ser/lib/smtp.jar
CLASSPATH=$CLASSPATH:/data/ser/lib/imap.jar
export CLASSPATH

java main.Main  

----->   /home/christian/JMyScanner/JMyScanner.ini <----- das verstehe ich nur noch nicht?! Der Pfad zur Main datei?
Und wieso ruft man die main.Main auf?!  nicht mit .java?


----------



## bygones (12. Jan 2011)

er sagte doch *Hier mal ein Beispiel von mir*, also mit seiner Main Klasse, die einen Parameter aufnimmt


----------



## homer65 (12. Jan 2011)

bygones hat gesagt.:


> er sagte doch *Hier mal ein Beispiel von mir*, also mit seiner Main Klasse, die einen Parameter aufnimmt



So ist es, das war nur ein Beispiel.
Wenn du keine Parameter übergibst, kannst du es einfach weglassen.
Funktioniert es denn jetzt?


----------



## akchillo (12. Jan 2011)

Nein noch nicht ganz mein sieht jetzt so aus.

CLASSPATH=$CLASSPATH:/data/rser/lib/dsn.jar 
CLASSPATH=$CLASSPATH:/data/rser/lib/jdom.jar
CLASSPATH=$CLASSPATH:/data/rser/lib/pop3.jar
CLASSPATH=$CLASSPATH:/data/rser/lib/jdom.jar
CLASSPATH=$CLASSPATH:/data/rser/lib/smtp.jar
CLASSPATH=$CLASSPATH:/data/rser/lib/imap.jar
export CLASSPATH

java /data/rse/bin/main.Main 

Fehler meldung could not find the main class


----------



## bygones (12. Jan 2011)

akchillo hat gesagt.:


> java /data/rse/bin/main.Main


das schaut auch schon gar nicht richtig ist...

Wie heißt deine Main Klasse ? wo liegt sie ?

Angenommen deine Klassen liegen unter /data/rse/bin. dort liegt deine Main Klasse mit dem Namen Main:

```
cd /data/rse/bin
java Main
```

wenn deine Klassen unter /data/rse/bin liegen und deine Main Klasse im package main:

```
cd /data/rse/bin
java main.Main
```


----------



## akchillo (12. Jan 2011)

meine main klasse heißt main. Sie liegt unter 

data/wbxmlparser/src/main.java

und dort....

data/wbxmlparser/src/main.class


----------



## bygones (12. Jan 2011)

woher kam das bin dann ?!

```
cd data/wbxmlparser/src
java main
```


----------



## akchillo (12. Jan 2011)

funktioniert. ich gebe euch allen ein virtuelles Bier aus


CLASSPATH=$CLASSPATH:/data/rser/lib/dsn.jar 
CLASSPATH=$CLASSPATH:/data/rser/lib/jdom.jar
CLASSPATH=$CLASSPATH:/data/rser/lib/pop3.jar
CLASSPATH=$CLASSPATH:/data/rser/lib/jdom.jar
CLASSPATH=$CLASSPATH:/data/rser/lib/smtp.jar
CLASSPATH=$CLASSPATH:/data/rser/lib/imap.jar
CLASSPATH=$CLASSPATH:/data/rser/bin/main.class
export CLASSPATH

cd /data/rser/bin/
java main


----------



## homer65 (12. Jan 2011)

Poste doch mal bitte den Inhalt von main.java

Edit: Ups ne Sekunde zu spät.


----------



## homer65 (12. Jan 2011)

akchillo hat gesagt.:


> funktioniert. ich gebe euch allen ein virtuelles Bier aus
> 
> 
> CLASSPATH=$CLASSPATH:/data/rser/lib/dsn.jar
> ...



Freut mich für dich.
Eine Anmerkung hätte ich allerdings noch.
Statt

```
CLASSPATH=$CLASSPATH:/data/rser/bin/main.class
```
Im CLASSPATH eine einzelne Klasse anzugeben, gibt man um .class Dateien zu finden (nicht .jar) nur das Verzeicnis an; also:

```
CLASSPATH=$CLASSPATH:/data/rser/bin/
```


----------

