Netbeans und JDKs

Moin,
folgende Situation:
Netbeans 5.5.1, J2EE-Anwendung. In den Projekteigenschaften steht überall 1.4. Programm wird ausgeführt, liest darin die System.Properties aus und zeigt aber:

java.runtime.version:1.6.0_06-b02
java.home:D:\jdk1.6.0_06\jre
java.version:1.6.0_06

In Netbeans funktioniert alles einwandfrei, insbesondere ein Aufruf
…getRuntime().exec(“cmd.exe /c irgendeine.exe”);

Jetzt passiert folgendes: Das Programm wird deployed und wird außerhalb und ohne Netbeans gestartet. Dort sehe ich plötzlich

java.runtime.version:1.4.2_15-b02
java.home:D:\j2sdk1.4.2_15\jre
java.version:1.4.2_15

Außerdem wird der exec(…) wohl ohne Exception oder Error ausgeführt, doch der Befehl verfehlt seine Wirkung (Änderung einer Berechtigung in LDAP).

Der exec-String alleine auf der Konsole ausgeführt, funktioniert ebenfalls, nur in der Java-Anwendung außerhalb von Netbeans nicht.

Was ist da los? Hängt das mit den unterschiedlichen Java-Versionen zusammen? Und wie kann ich bei Netbeans so auf 1.4 umstellen, dass das auch genommen wird bei java.version usw.?

Ich kenne mich nicht mit Netbeans aus, aber üblicher Weise kann man in IDEs verschiedene Java Virtual Maschines eintragen. Die Einstellung 1.4 in den Projekteigenschaften ist die Compiler-Einstellung. Sie legt fest, welche Class-File-Version die kompilierten .class-Dateien haben. Sie sagt nichts darüber aus, welche Version die Virtuelle Maschine hat. Wenn Du 1.4-Kompatibilität eingestellt hast, aber gegen eine Java-6-Umgebung kompilierst (wie Du es wahrscheinlich tust) kannst Du auch auf Klassen und Methoden zugreifen, die es in Java 6 gibt, in Java 1.4 aber noch nicht. Da muss man also aufpassen und am besten die entsprechende Java-VM im Netbeans eintragen.

Warum Dein Programm nicht funktioniert, kann ich nicht sagen. Vielleicht liegt’s an was ganz anderem; zum Beispiel am CWD (current working directory ^= aktuelles Verzeichnis in dem das Programm ausgeführt wird).

Ebenius

[QUOTE=Ebenius]Ich kenne mich nicht mit Netbeans aus, aber üblicher Weise kann man in IDEs verschiedene Java Virtual Maschines eintragen. Die Einstellung 1.4 in den Projekteigenschaften ist die Compiler-Einstellung. Sie legt fest, welche Class-File-Version die kompilierten .class-Dateien haben. Sie sagt nichts darüber aus, welche Version die Virtuelle Maschine hat. Wenn Du 1.4-Kompatibilität eingestellt hast, aber gegen eine Java-6-Umgebung kompilierst (wie Du es wahrscheinlich tust) kannst Du auch auf Klassen und Methoden zugreifen, die es in Java 6 gibt, in Java 1.4 aber noch nicht. Da muss man also aufpassen und am besten die entsprechende Java-VM im Netbeans eintragen.
[/QUOTE]
Bei den Projekteigenschaften steht wie gesagt überall wo eine Version einzutragen oder auszuwählen ist eine 1.4. Wo also soll ich da noch etwas von 1.6 (was nirgends zu sehen ist) auf 1.4 ändern? Im Platform-Manager ist auch 1.4 dabei, sonst könnte man das auch kaum in den Projekteigenschaften auswählen.
Das ist ja das Rätsel.

[QUOTE=Ebenius;9303]
Warum Dein Programm nicht funktioniert, kann ich nicht sagen. Vielleicht liegt’s an was ganz anderem; zum Beispiel am CWD (current working directory ^= aktuelles Verzeichnis in dem das Programm ausgeführt wird).

Ebenius[/QUOTE]
Der Pfad kann es nicht sein, da cmd.exe überall gefunden wird und das Programm mit Pfad folgt in der Art

cmd.exe /c D:/irgendwo/irgendeine.exe…

Konnte dir nicht ganz folgen.
Klingt nach einem Problem mit dem Compile-Level. Du kompilierst mit Java 1.6, stellst aber den Compiler Level auf 1.4, um sicher zu stellen, dass es auch mit 1.4 läuft.
Eine Mutmaßung: Vielleicht erkennt der Interpreter nun den Compiler Level und startet daraufhin die passende JRE, wenn sie im System installiert ist.
Ich weiß nicht, ob es so etwas gibt, oder ob es etwas damit zu tun hat.

[QUOTE=L-ectron-X]Konnte dir nicht ganz folgen.
Klingt nach einem Problem mit dem Compile-Level. Du kompilierst mit Java 1.6, stellst aber den Compiler Level auf 1.4, um sicher zu stellen, dass es auch mit 1.4 läuft.
[/QUOTE]
Hä? Wie geht denn sowas?

Warum läuft dann in NB die 1.6er JRE und außerhalb die 1.4er?

Guck Dir mal die Platform-Konfiguration im NetBeans an. Wie gesagt, ich benutze kein NetBeans (nur Eclipse) und kann daher nicht genau sagen, wie man unter NetBeans die verschiedenen JDKs/JREs einstellt. Der Link scheint aber zumindest zu helfen, wenn Du ein anderes Java (Java 1.4) im NetBeans zum kompilieren/ausführen benutzen möchtest… http://www.netbeans.org/kb/docs/java/project-setup.html#projects-configuring

HTH, Ebenius

Tach,
das mit dem JDK usw ist wie bereits gesagt in Netbeans alles auf 1.4 eingestellt, nicht nur source level.
Hingegen bringt ein Netbeans-Start mit harten Bandagen --jdk-home 1.4… nur Fehlermeldungen, weil für etliche Dinge 1.5 erforderlich ist. Geht also auch nicht. Hilft nur, den Tomcat für außerhalb Netbeans auf 1.6 zu puschen. Das ist inzwischen geschehen, so dass java.version etc. sowohl unter Netbeans als auch ohne Netbeans auf 1.6 zeigt. Dennoch: Es funktioniert nicht. Schlimmer noch: Selbst ein popeliger notepad.exe-Aufruf via getRuntime().exec() geht außerhalb Netbeans in die Binsen. Ich stehe vor einem Rätsel, mir gehen die Ideen aus.

Auf den Rechnern hier ist überall Norton drauf - kann der seine Finger drauf haben?

Keine Ahnung. Hast Du mal das Environment aus Java heraus überprüft? Vielleicht Pfad-Variable anders, oder sowas… Sicher, dass Du keine Exceptions verschluckst?

Ebenius

[QUOTE=Ebenius]Keine Ahnung. Hast Du mal das Environment aus Java heraus überprüft?
[/QUOTE]
Ich lasse mir sämtliche System-Properties ausgeben, so habe ich den Vergleich zwischen „in Netbeans“ und ohne Netbeans.

Keine relevante.

[QUOTE=Ebenius;9313]
Sicher, dass Du keine Exceptions verschluckst?

Ebenius[/QUOTE]
Jou. Der exec-Aufruf liefert keinen ErrorStream zurück, außerdem ist er in einem try-catch-Block.

… und der catch-Block schreibt die Fehlermeldung raus? Dann hab ich keine Idee.

Vorschlag: Mach ein Winzig-Programm das das Problem reproduziert und poste es hier.

Ebenius

[QUOTE=Ebenius]… und der catch-Block schreibt die Fehlermeldung raus?
[/QUOTE]
Nee, eben nicht. Es gibt keinen Fehler, weder steht was im ErrorStream noch läuft das Programm in den catch-Block.

[QUOTE=Ebenius;9317]
Dann hab ich keine Idee.

Vorschlag: Mach ein Winzig-Programm das das Problem reproduziert und poste es hier.

Ebenius[/QUOTE]
Dürfte schwierig werden. ^^
Außerdem gibt es jetzt Level 2:
Selbst ein einfacher notepad.exe Aufruf in exec() funktioniert außerhalb Netbeans nicht. Und außerhalb Netbeans bekomme ich

java.vm.name:Java HotSpot™ Server VM

Während in Netbeans das hier angezeigt wird:

java.vm.name:Java HotSpot™ Client VM

Sondern? Rufst Du Process.waitFor() auf? Bleibt Dein Java-Programm dann einfach stehen, oder beendet sich der gegabelte Prozess?

Was passiert denn, wenn Du das Problem isolierst? Wieso soll das schwer sein, verstehe ich nicht.

Wie auch immer, ohne mehr Material komm ich hier nicht weiter.

Ebenius

[QUOTE=Ebenius]Sondern? Rufst Du Process.waitFor() auf? Bleibt Dein Java-Programm dann einfach stehen, oder beendet sich der gegabelte Prozess?
[/QUOTE]
Das ist interessant. Beim “normalen” Aufruf des gewollten Programms läuft die Anwendung weiter. Will ich jedoch notepad.exe aufrufen, bleibt das Programm stehen.

[QUOTE=Ebenius;9319]
Was passiert denn, wenn Du das Problem isolierst? Wieso soll das schwer sein, verstehe ich nicht.

Wie auch immer, ohne mehr Material komm ich hier nicht weiter.

Ebenius[/QUOTE]
Ist halt ein fettes Programm, aus dem man nicht mal eben sowas extrahieren kann. Außerdem ist meine Arbeitskollegin etwas eigen, was das Thema Arbeitsstil, Test und Korrektur angeht (ist nicht mein Projekt, ich soll ihr nur bei der Fehlerbeseitigung helfen).