• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

Java ausführung Automatisieren

Bilbao

Wohlschmecker aus Vierlanden
Registriert
25.01.06
Beiträge
238
Hi Leute!

Ich lerne zurzeit Java Programmierung in der Schule
Wenn ich jetzt zuhause ein Java Programm schreibe und es starten will geh ich in Terminal geh zur Location des Files mach Javac Filename und dann Java Filename.


So weit so gut...

Jetzt die Frage: Unter Windows weiss ich kann man zumindest das starten per *.bat datei automatisieren. Dazu klicke ich doppelt auf diese datei und Voila das programm fängt an zu laufen. Mein Lehrer meinte unter Unix system funktioniert sowas mit shell scripten doer so :S

Kann mir einer mal erklären was genau ich dafür machen muss (die shell datei wird im sleben verzeichen ligen wie die .class datei (so spar ich mir di Pfad bezeichnung (zumindest bei Windows)))

Vielen Dank schonmal im Voraus
 

Dr. Koffein

Empire
Registriert
19.01.05
Beiträge
89
Shellskript

Hallo Bilbao,

die Antwort auf Deine Frage ist ganz einfach. Mit einem simplen Shell-Skript kannst Du einen Wrapper für Dein Javaprogramm schreiben, so dass ein einfaches Aufrufen des Shellskripts Dir den Aufruf von Java erleichtert. Ein entsprechendes Shellskript sieht dann folgendermaßen aus:

Code:
#! /bin/bash

java JavaKlasse

Dieses Skript speicherst Du dann (üblicherweise mit der Endung .sh, aber nicht zwingend), z.B. als "JavaKlasse.sh".

Diese Datei musst Du noch als ausführbar markieren, damit dies von der Shell als Skript erkannt wird:

Code:
> chmod +x JavaKlasse.sh

Anschliessend kannst Du Dein Programm per Shellaufruf (./JavaKlasse.sh) starten. Ich hoffe, meine Beschreibung hat Dir weitergeholfen.

Viele Grüße,
drk
 
Zuletzt bearbeitet:

tfc

Ontario
Registriert
21.07.07
Beiträge
348
Oder Du gibst dem Shellscript die Dateiendung ".command".
So reagiert das Script auch auf Mausklick und das käme dann der Batch-Methode unter Windows sehr nahe.

Wobei eine immer offene Konsole sowieso praktisch ist und das nicht nötig wäre.
 

Bilbao

Wohlschmecker aus Vierlanden
Registriert
25.01.06
Beiträge
238
und wo genau schreib ich das jetzt? bei windows ha ich immer einfach ne textdatei genommen was reingeschreiben und dann umbenannt...

DAnke schon mal für die Antworten... Aber sollte schon wie tfc beschireben per mausklick ausführbar sein und eben nicht Pfadgebunden :D:D

Ne bergriffserklärung wäre auch nicht schelcht (also der einzelnen schritten) (was chmod -x ist und so oder das /bin/bash)


Hab das nebenbei versucht mit dem .command

problem ist es geht auf dann kommt ein fehler und dann Prozess beendet. Wenn ich es aber wie immer übers Terminal aufrufe gehts nur net mit dem .command datei
 
Zuletzt bearbeitet:

quarx

Brauner Matapfel
Registriert
17.04.05
Beiträge
8.444
Java-Programme mit grafischer Oberfläche kannst Du übrigens einfach durch Doppelklick auf die *.class-Datei starten. ;)
 

Bilbao

Wohlschmecker aus Vierlanden
Registriert
25.01.06
Beiträge
238
Sind aber zurzeit alles noch programm die keine Grafische oberfläche haben :D
 

Dr. Koffein

Empire
Registriert
19.01.05
Beiträge
89
und wo genau schreib ich das jetzt? bei windows ha ich immer einfach ne textdatei genommen was reingeschreiben und dann umbenannt...

In eine Textdatei...

Ne bergriffserklärung wäre auch nicht schelcht (also der einzelnen schritten) (was chmod -x ist und so oder das /bin/bash)

Ein bisschen was sollte man immer selber tun:
http://de.wikipedia.org/wiki/Shebang
http://www.bin-bash.de/index.php
http://de.wikipedia.org/wiki/Chmod


Hab das nebenbei versucht mit dem .command

problem ist es geht auf dann kommt ein fehler und dann Prozess beendet. Wenn ich es aber wie immer übers Terminal aufrufe gehts nur net mit dem .command datei

Ein Fehler? Das mindeste wäre es, denn Fehler mal zu beschreiben :)
Ich gehe mal davon aus, dass der Fehler lautet wie

Code:
Exception in thread "main" java.lang.NoClassDefFoundError: <KLASSENNAME>

Das liegt daran, dass dein Command-Skript nicht im entsprechenden Directory aufgerufen wird. Du musst also den Classpath in Deinem Skript entsprechend setzen, damit Deine Javaklasse auch gefunden wird. Erläuterungen dazu finden sich hier: http://www.kevinboone.com/classpath.html

Dein Skript müsste also wie folgt aussehen (es ist die Datei skript.command, die Du einfach mit einem Texteditor erstellst):

Code:
#!/bin/bash

java -cp <PFAD_ZUM_VERZEICHNIS_DEINER_JAVA_KLASSE> <KLASSENNAME>

also z.B.

Code:
#!/bin/bash

java -cp ~/Desktop Test

(wenn beispielsweise Deine Klasse Test.class auf Deinem Schreibtisch liegt)


Viele Grüße,
drk
 
Zuletzt bearbeitet:

Bilbao

Wohlschmecker aus Vierlanden
Registriert
25.01.06
Beiträge
238
ja aber genau das wollte ich ja vermeiden.....
ich bins halt von windows gewöhnt das automatisch immer erst in dem verzeichnis sucht wo sich die datei befindet die grad geöffnet wurde...

denn wenn ich das so mache muss ich das für jeden mac erstml umschreiben oder bei jedem mac ins selbe verzeichnis kopieren
 

Skeeve

Pomme d'or
Registriert
26.10.05
Beiträge
3.120
Probier mal
Code:
#!/bin/sh
here=`dirname $0`
cd $here
java meinjavaprogramm
Das sollte dann eigentlich klappen, da es zuvor in das passende Verzeichnis wechselt.
 

Bilbao

Wohlschmecker aus Vierlanden
Registriert
25.01.06
Beiträge
238
habs jetzt so gemacht wie Skeeve

dann bekomm ich das hier wenn ich matrix.class mache

Last login: Mon Jan 7 14:03:07 on ttyp1
Welcome to Darwin!
/Users/Ilja/Desktop/Java\ Unterricht/Matrix.command; exit
ilja-schwarz:~ Ilja$ /Users/Ilja/Desktop/Java\ Unterricht/Matrix.command; exit
usage: dirname path
Exception in thread "main" java.lang.NoClassDefFoundError: Matrix/class
logout
[Prozess beendet]

und das hier ohne .class am ende (denn beim aufrufen normal geb ich es ja auch ohne die endung einfach nur java Matrix ein )
Last login: Mon Jan 7 14:03:49 on ttyp1
Welcome to Darwin!
ilja-schwarz:~ Ilja$ /Users/Ilja/Desktop/Java\ Unterricht/Matrix.command; exit
usage: dirname path
Exception in thread "main" java.lang.NoClassDefFoundError: Matrix
logout
[Prozess beendet]
 

Skeeve

Pomme d'or
Registriert
26.10.05
Beiträge
3.120
Weil ein Blank im Namen steht. :(
Code:
#!/bin/sh
here=`dirname "$0"`
cd "$here"
java meinjavaprogramm
 

Bilbao

Wohlschmecker aus Vierlanden
Registriert
25.01.06
Beiträge
238
Perfekt jetzt gehts vielen vielen dank :D

gibt es jetzt noch ne möglichkeit das diese datei sich sleber erstellt mit automator doer so?? das ich dem das rohmodel gebe und der dann selber imer nur den datei namen ändert??

(ja ich weiss ich will mal wieder zu viel :p )
 

Skeeve

Pomme d'or
Registriert
26.10.05
Beiträge
3.120
Bitte sehr, bitte gleich...
on run
   tell me to open {choose file}
end run

on open some_things
   repeat with a_thing in some_things
      set thing_info to info for a_thing
      if name extension of thing_info is "class" then
         set starter_name to text 1 thru (-2 - (length of name extension of thing_info)) of POSIX path of a_thing
         do shell script "echo " & (quoted form of "#!/bin/sh
here=`dirname \"$0\"`
cd \"$here\"
java \"$0.class\"
") & " > " & (quoted form of starter_name) & " ; chmod +x " & (quoted form of starter_name)
      end if
   end repeat
end open

  1. In den Script Editor kopieren
  2. Als Programm JavaStarterMaker sichern
  3. Ein oder mehrere .class Dateien drauffallen lassen
  4. Für jede DATEI.class wird eine DATEI erstellt, die die .class aufruft
 

Bilbao

Wohlschmecker aus Vierlanden
Registriert
25.01.06
Beiträge
238
WOW vielen vielen dank Skeeve

(wenn du mir noch schnell sagst was für einen script editor du meinst :D wäre das perfekt) (oder muss ich einfach nur ne txt datei damit erstellen??)

edit: habs jetzt geschafft nur wenn ich jetzt was fallen lasse dann erstellt er mir ne datei die terminal so nicht öffnen kann...
dann hab ich einfach der erstellten datei nen .command am ende verpasst und dann kam das
Welcome to Darwin!
ilja-schwarz:~ Ilja$ /Users/Ilja/Desktop/Matrix.command; exit
Exception in thread "main" java.lang.NoClassDefFoundError: /Users/Ilja/Desktop/Matrix/command/class
logout
[Prozess beendet]
 
Zuletzt bearbeitet:

Skeeve

Pomme d'or
Registriert
26.10.05
Beiträge
3.120
Ich dachte, Du wolltest die von Kommandozeile aus starten. Dazu braucht's kein ".command". Den Fehler habe ich hoffentlich hier mit korrigiert. Wenn Du unbedingt willst, kannst Du die property "with_command" auf true setzen, dann hängt er die per default an.
property with_command : false

on run
   tell me to open {choose file}
end run

on open some_things
   repeat with a_thing in some_things
      set thing_info to info for a_thing
      if name extension of thing_info is "class" then
         set starter_name to text 1 thru (-2 - (length of name extension of thing_info)) of POSIX path of a_thing
         if with_command then
            set starter_name to starter_name & ".command"
         end if
         do shell script "echo " & (quoted form of "#!/bin/sh
here=`dirname \"$0\"`
if [ -n \"$here\" ] ; then
   cd \"$here\"
fi
java `basename \"$0\" .command`
") & " > " & (quoted form of starter_name) & " ; chmod +x " & (quoted form of starter_name)
      end if
   end repeat
end open
 

Bilbao

Wohlschmecker aus Vierlanden
Registriert
25.01.06
Beiträge
238
BIG BIG THX

kannst du das mal mit comments versehen damit ich versteh in welchel line was gemacht wird??
 

Skeeve

Pomme d'or
Registriert
26.10.05
Beiträge
3.120
Und hier ist noch eine Version, die ein .app draus macht. Dabei wird das Classfile in die app kopiert. Somit ist die .app beliebig kopierbar.

Du mußt das wie zuvor in den ScriptEditor kopieren aber diesmal als "Programm Bundle" sichern unter dem namen "class2app"

property my_name : ""
property my_path : ""

on run
   if not init() then return
   
   -- do we already have a Java class?
   try
      set my_java to path to resource "Java"
   on error
      tell me to open {choose file}
      return
   end try
   
   -- so here we go
   tell application "Terminal" to do script "cd " & (quoted form of POSIX path of my_java) & " ; java " & (quoted form of my_name)
end run

on open some_things
   
   if not init() then return
   
   set local_java to text (length of (POSIX path of my_path)) thru -9 of (POSIX path of (path to resource "Scripts")) & "Java/"
   
   repeat with a_thing in some_things
      set thing_info to info for a_thing
      if name extension of thing_info is "class" then
         set starter_name to (text 1 thru (-1 - (length of name extension of thing_info)) of POSIX path of a_thing) & "app"
         set java_copy to starter_name & local_java
         do shell script "cp -r " & (quoted form of POSIX path of my_path) & " " & (quoted form of starter_name) & ";rm -rf " & (quoted form of java_copy) & ";mkdir -p " & (quoted form of java_copy) & ";cp " & (quoted form of POSIX path of a_thing) & " " & (quoted form of java_copy)
      end if
   end repeat
end open

on init()
   
   -- check my name and path
   set my_path to path to me
   
   tell (info for my_path)
      set my_name to name
      set my_ext to name extension
      set is_bundle to type identifier is "com.apple.application-bundle"
      if my_ext is not "" then
         set my_name to text 1 thru (-2 - (length of my_ext)) of my_name
      end if
   end tell
   
   -- are we in script editor?
   if my_name is "Script Editor" then
      display alert "Save as application bundle first"
      return false
   end if
   
   -- is this a bundle?
   if not is_bundle then
      display alert "This is not an application bundle!"
      return false
   end if
   
   return true
end init
 
Zuletzt bearbeitet:

Skeeve

Pomme d'or
Registriert
26.10.05
Beiträge
3.120
BIG BIG THX

kannst du das mal mit comments versehen damit ich versteh in welchel line was gemacht wird??
;) Das ist AppleScript gemischt mit shell script. Das ist mir jetzt, ehrlich gesagt, zu aufwendig. Ein bischen was sollst Du auch selbst tun. Mir hates Spaß gemacht, das zu programmieren, aber jetzt jede Zeile zu kommentieren macht keinen Spaß. Wenn Du spezielle Fragen hast, dann kannst Du gerne fragen und ich versuche das dann zu erklären.
 

MacMark

Jakob Lebel
Registriert
01.01.05
Beiträge
4.874
Es genügt, mit jar ein JAR-Archiv zu erzeugen, daß die Klassen enthält. Darin sollte META-INF/MANIFEST.MF mit der Zeile "Main-Class: MeineMainKlasseSeineNameHier" enthalten sein. Ein Doppelklick im Finder startet das Programm dann, egal ob graphisch oder nicht.

Beispiel für Manifest-Datei extrahieren:
jar xf /Developer/Examples/Java/JavaAdvancedImaging/JAIDemo/JAIDemo.jar META-INF/MANIFEST.MF

Doppelklick auf beispielsweise JAIDemo.jar startet das Java-Programm. Zu finden in /Developer/Examples/Java/JavaAdvancedImaging/JAIDemo/