Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Aufruf von java über batch

Frage Entwicklung Java

Mitglied: strzata

strzata (Level 1) - Jetzt verbinden

25.06.2014, aktualisiert 26.06.2014, 4152 Aufrufe, 16 Kommentare

Hallo,
ich weiss nicht, ob an dieser Stelle die Frage richtig plaziert ist.
Ein fremdes Java-Programm (normaler Aufruf: java -Xmx500m -Dfile.encoding=8859_15 -classpath ...) soll aus einer Assembly unter Vb.Net gestartet werden. Bislang gab es unter XP keine Probleme. Verschiedene 64er WIN 7 Rechner wollen das mitunter nicht mehr.
Unter XP ging es so:
Dim p As New Process
Dim psi As New ProcessStartInfo("javaw", JCode)
p.StartInfo = psi
p.Start()
in JCode steht der Text "-Xmx500m -classpath ...

Unter WIN 7 funktioniert das nicht mehr. Ich musste eine BatchDatei schreiben und diese wie folgt aufrufen:
Dim p As New Process
Dim psi As New ProcessStartInfo("cmd")
psi.Arguments = "/c " & PrfModDir & "\prfModStart.bat"
p.StartInfo = psi
p.Start()

Auf manchen Rechnern mit WIN 7 läuft auch das nicht. Startet man die batch durch Doppelklick, ist alles OK. Rufe ich sie aus Vb.Net heraus auf, klappt es nicht. Habe herausgefunden, dass der Aufruf von java fehl schlägt (Befehl falsch geschrieben oder Datei nicht gefunden). Wenn ich in psi die Argumente weglasse und nur das Command-Fenster erscheinen lasse, kann ich hier eintippen: prfModStart.bat und alles verläuft problemlos. Jedoch bekomme ich nun einen Returncode von -1073741510 zurück, der meine Auswerte-Routine durcheinander bringt.

Meine Assembly ist unter 32 Bit kompiliert. Die WIN7-Rechner sind 64 Bit Versionen. Liegt es vielleicht daran? Kann man auf einem Rechnern nebeneinander java 1.8 64 Bit und java 1.7 32 Bit benutzen? Dann würde ich das mal versuchen.


Mitglied: Gersen
25.06.2014 um 16:23 Uhr
Hallo,

Habe herausgefunden, dass der Aufruf von java fehl schlägt (Befehl falsch geschrieben oder Datei nicht gefunden).

Mal versucht, den kompletten Pfad zur Java-EXE zu übergeben?

Kann man auf einem Rechnern nebeneinander java 1.8 64 Bit und java 1.7 32 Bit benutzen?

Man kann beide installieren. Dann sollte man aber beim Aufruf unbedingt den Pfad mit angeben.

Gruß,
Gersen
Bitte warten ..
Mitglied: Snowman25
25.06.2014 um 16:58 Uhr
Zitat von strzata:

Hallo,
Hallo.
ich weiss nicht, ob an dieser Stelle die Frage richtig plaziert ist.
Ein fremdes Java-Programm (normaler Aufruf: java -Xmx500m -Dfile.encoding=8859_15 -classpath ...) soll aus einer Assembly unter
Vb.Net gestartet werden. Bislang gab es unter XP keine Probleme. Verschiedene 64er WIN 7 Rechner wollen das mitunter nicht mehr.
Unter XP ging es so:
Dim p As New Process
Dim psi As New ProcessStartInfo("javaw", JCode)
p.StartInfo = psi
p.Start()
in JCode steht der Text "-Xmx500m -classpath ...

Unter WIN 7 funktioniert das nicht mehr. Ich musste eine BatchDatei schreiben und diese wie folgt aufrufen:
Dim p As New Process
Dim psi As New ProcessStartInfo("cmd")
psi.Arguments = "/c " & PrfModDir & "\prfModStart.bat"
p.StartInfo = psi
p.Start()

Das ist ein VisualBasic-Script, kein Batch!
Wieso so umständlich?
Das Programmverzeichnis ist höchstwahrscheinlich nicht in deiner %PATH%-Variable vorhanden. Benutze den kompletten Pfad zur Java.exe.

Meine Assembly ist unter 32 Bit kompiliert. Die WIN7-Rechner sind 64 Bit Versionen.
Dann brauchst du ein 32-Bit Java.
Liegt es vielleicht daran? Kann man auf einem Rechnern nebeneinander java 1.8 64 Bit und java 1.7 32 Bit benutzen?
Ja kann man. Aber ACHTUNG! Die 64-Bit Version von Java hat keinen Auto-Updater.

Gruß,
Snowman25
Bitte warten ..
Mitglied: strzata
25.06.2014 um 17:35 Uhr
Vielen Dank für den Hinweis. Das funktioniert! Also liegts wahrscheinlich nicht an der Diskrepanz zwischen 32 und 64 Bit. Nun stehe ich vor dem Problem, dass jeder Nutzer sein Java woanders hin installiert hat. Ich brauche also eine Funktion in Vb.Net, die mir den Pfad zur java.exe als String zurückgibt. Wie bekommt man den heraus? Kann ich ihn aus der Registry auslesen (die Funktion kenne ich)? Aber steht er bei jedem Java-Update im gleichen Zweig und Schlüssel? Oder gibts einen DOS-Befehl (ähnlich java -version), der mir den Pfad anzeigt? Wäre toll, wenn Du mir nochmals helfen könntest. Danke!
Bitte warten ..
Mitglied: strzata
25.06.2014 um 17:39 Uhr
@Snowman25:
Habe Deinen Beitrag leider zu spät gesehen. Danke. Der Code ist Vb.Net und hat nichts mit der Batch zu tun. In der Batch steht nur der Aufruf von java mit den entsprechenden Parametern. Ich bin noch beim Basteln ...
Bitte warten ..
Mitglied: Gersen
25.06.2014, aktualisiert um 18:02 Uhr
Es gibt alles - es kommt auf die Umgebungen an.

Es gibt unter Windows den Befehl "where" (Pendant zum Linux-"which").

Ein
01.
where java.exe
gibt den ersten Fund anhand der Reihenfolge in der PATH-Variablen zurück. Bei mir: C:\Windows\System32\java.exe

Es gibt manchmal die System-Variable "JAVA_HOME".

Es gibt den Registry-Key HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\{hier kommt evtl. noch eine Versionsnummer}\JavaHome.

Gruß,
Gersen
Bitte warten ..
Mitglied: strzata
25.06.2014 um 18:21 Uhr
Hörte sich sehr gut an. Ich war schon happy. Danke! Jedoch zu früh gefreut.
In WIN 7 --> perfekt! Aber unter XP gibt's WHERE nicht (sagt mir das System zumindest). Und einige Anwender fahren immer noch XP. Kann es also nicht nutzen.
Wenn sich in der Registry der Schlüssel ändert, weil beim Java-Update eine neue Versionsnummer eingetragen wird, nützt es mir auch nix. Denn dann kann ich den Schlüssel in meine Assembly nicht fest eincodieren.
Gibts noch ein anderes Tricky?
Bitte warten ..
Mitglied: Gersen
25.06.2014 um 18:45 Uhr
Du kannst die aktuelle Versionsnummer für den o.g. Registry-Zweig finden - der steht auch in der Registry.

Und zwar unter HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\CurrentVersion.

Mit dem Wert suchst Du dann HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\{Ergebnis aus oben}\JavaHome.
Bitte warten ..
Mitglied: strzata
25.06.2014 um 19:42 Uhr
Jaaaa! Prima. Und die java.exe ist dann immer im Unterordner Bin?
Bitte warten ..
Mitglied: Gersen
LÖSUNG 25.06.2014, aktualisiert um 20:03 Uhr
Dort legt es die Installations-Routine ab.

Ich gehe mal davon aus, dass Du Dein Programm dahingehend absicherst, dass Du prüfst, ob die Datei dort existiert. Im Negativfall findest Du die Datei(en) immer noch mal unter C:\Windows\System32...
Bitte warten ..
Mitglied: strzata
25.06.2014 um 20:03 Uhr
Perfekt! Vielen Dank nochmal. Tolles Forum!
Bitte warten ..
Mitglied: Snowman25
26.06.2014 um 09:57 Uhr
Zitat von Gersen:

where java.exe
gibt den ersten Fund anhand der Reihenfolge in der PATH-Variablen zurück. Bei mir: C:\Windows\System32\java.exe

Dann gäbe es aber das Problem nicht, dass java nicht aufgerufen werden kann.
Sobald es in der PATH steht kann man ja direkt java.exe aufrufen.

Es gibt den Registry-Key HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\{hier kommt evtl. noch eine
Versionsnummer}\JavaHome.
^ this
Bitte warten ..
Mitglied: strzata
26.06.2014 um 11:43 Uhr
Da Snowman25 den Thread nochmal aufgemacht hat, erlaube ich mir, ihn fortzusetzen (kann ein Admin das "gelöst" entfernen ?).
Eine Anmerkung: Wenn ich ein Java Programm aus einer 32 Bit Assembly über eine Batchdatei aufrufe, brauche ich keine Java 32 Bit Version. Über das Cmd wird die richtige Java Version angezogen.
Die Anwender den Pfad zu Java in das PATH eintragen zu lassen, ist keine benutzerfreundliche Idee. Ich mache es jetzt so, dass ich den Pfad aus der Registry auslese. Das Java Programm ist ein Fremdprogramm und es ändert sich sehr oft (neue Variablen). Die Batchdatei muss also beim Starten dieses Progs sowieso jedesmal neu erstellt werden (ich passe deren Aufruf an meine Bedürfnisse an). Und dabei schreibe ich nun gleich den Pfad zu Java vorn dran.

Weshalb ich den Thread fortsetze ist eine weitere Frage zu diesem Thema. Wie ich schon geschrieben habe, funktioniert der Java-Aufruf aus meiner 32 Bit Assembly unter WIN 7 64 nicht mehr. Das hängt sicher damit zusammen, dass der Anwender dann auch unbedingt eine 32 Bit Java Version haben muss. Das kann ich nicht voraussetzen. Deshalb jetzt der Weg über eine Batchdatei. Aber: ich muss den Returncode des Java-Programms auswerten. Den fängt ja nun das Cmd auf. Reicht es diesen Wert durch zum Aufrufer der Batch??? Es gibt dabei nämlich nicht nur 0 und 1, sondern auch andere Werte, die dem Anwender spezielle Hinweise geben. Hier nochmal der Vb.Net Codeschnipsel:

Dim p As New Process
Dim psi As New ProcessStartInfo("cmd")
psi.Arguments = "/c " & PrfModDir & "\prfModStart.bat"
p.StartInfo = psi
p.Start()
Dim eCode As Integer = p.ExitCode
Select Case eCode
Case 0 ...

Hoffe sehr, dass sich nochmal jemand erbarmt.
Viele Grüße
Norbert
Bitte warten ..
Mitglied: Gersen
26.06.2014 um 19:11 Uhr
Hallo,

vielleicht, indem Du die Batch-Datei etwa so aufbaust:

01.
@echo off 
02.
rem ... 
03.
set errorlevel= 
04.
{Deine Java-Anweisung} 
05.
exit /b %errorlevel%
Ist ungetestet.

Gruß,
Gersen
Bitte warten ..
Mitglied: strzata
26.06.2014 um 20:47 Uhr
Danke, werde es versuchen. Woher ihr nur all sowas herwisst ...
Kann ich es irgendwie testen? Z.B. den Returncode simulieren?
Bitte warten ..
Mitglied: Gersen
26.06.2014, aktualisiert um 22:05 Uhr
Speichere folgenden Code (erfragt einen Zahlenwert und verlässt die Anwendung mit dem Zahlenwert als Returncode) in einer Datei namens "ExitCode.java" (auf dem Rechner muss zumindest die JRE installiert sein):
01.
import java.util.Scanner; 
02.
class ExitCode 
03.
04.
  public static void main(String[] args) 
05.
06.
        Scanner scan = new Scanner(System.in); 
07.
        System.out.print("ExitCode eingeben: "); 
08.
        int i = scan.nextInt(); 
09.
        System.exit(i); 
10.
11.
}
Das kompilierst Du über die Kommandozeile im Verzeichnis der Datei mittels
01.
 javac ExitCode.java
Du erhältst eine Datei "ExitCode.class".

Die kannst Du in Deiner Batch testweise einbauen.
01.
java -cp {Pfad zum Verzeichnis der ExitCode.class} ExitCode
(etwa -wenn die Datei unter C:\temp liegt-)
01.
java -cp C:\temp ExitCode)
Gruß,
Gersen
Bitte warten ..
Mitglied: strzata
27.06.2014 um 11:30 Uhr
Prima. Danke! Aber nun schliesse ich den Thread endgültig.
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Ähnliche Inhalte
Batch & Shell
Dateinamen nach Zeichnen abschneiden - Batch-Shell (9)

Frage von cberndt zum Thema Batch & Shell ...

Batch & Shell
CMD Verschlüsslung ( Batch ) (9)

Frage von clragon zum Thema Batch & Shell ...

Batch & Shell
gelöst älteste dateien via batch löschen (6)

Frage von cali169 zum Thema Batch & Shell ...

Batch & Shell
gelöst Suchen und Ersetzen mehrerer Suchbegriffe per Batch (4)

Frage von makroll10 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (25)

Frage von M.Marz zum Thema Windows Server ...

Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

Router & Routing
gelöst Empfehlung günstiges ADSL2+ nur Modem (10)

Frage von TimMayer zum Thema Router & Routing ...

Server-Hardware
Lenovo Server System X 3650 M5 Festplatten (9)

Frage von Hendrik2586 zum Thema Server-Hardware ...