Wofür benötigt man die Umgebungsvariablen sowohl in Windows 10 als auch in Mac OS Catalina

gsmv4

Mitglied
Hallo,

sobald ich in Mac OS Catalina ein JDK installiere, kann ich im Terminal die Befehle java und javac benutzen, wozu lege ich in der zshell (neue default in Mac OS Catalina) in der config Datei (~/.zshrc) "export JAVA_HOME=$(/usr/libexec//java_home)" und dann "export PATH=$JAVA_HOME/bin:$PATH" an? Ich würde einfach gerne den Grund verstehen.

Vielen Dank für eure Antworten.
 
K

kneitzel

Gast
Die Datei .zshrc in Deinem Home Verzeichnis konfiguriert einfach nur, wie die zshell sich verhalten soll.
Der PATH gibt an, wo die Shell überall nach einem Programm suchen soll. Wenn du also auf der Shell irgend einen Befehl eingibst ohne dabei den Pfad mit anzugeben, dann nimmt die Shell die PATH Variable und geht alle Verzeichnisse durch. In jedem Verzeichnis schaut die zshell: gibt es da das Programm, das Du ausführen möchtest. Wenn es das Programm gefunden hat, dann führt es den Befehl aus. Wenn es das Programm nicht findet, kommt die Fehlermeldung.

Die Variable JAVA_HOME ist nun lediglich ein Hinweis, denn einige Programme nutzen diesen Hinweis, um Java zu finden. Die suchen halt nicht nur nach java oder javac sondern die wollen teilweise auch auf das lib Verzeichnis zugreifen und so ...
Und natürlich steht dir die Variable auch zur Verfügung. Du kannst also in der .zshrc erst JAVA_HOME setzen um dann diese Variable im PATH zu verwenden. Wen du das dann später ändern willst, dann reicht eine Änderung aus, d.h. du musst nur JAVA_HOME anpassen und PATH ist dann automatisch angepasst.

Wichtig:
a) Das gilt erst einmal nur für die Shell und die Programme, die du aus der shell startest! Ein KDE oder Gnome oder was auch Programm, dass du über die GUI startest, bekommt davon nichts mit. (Bei windows 10 ist das anders. Da haben alle Programme, die in der User Session gestartet werden, diese Umgebungsvariablen.)
b) Die .zshrc wird nur beim start der shell gestartet. D.h. Änderungen bedürfen einem erneuten start der Shell.
 

gsmv4

Mitglied
Erstmal vielen Dank!

Aber warum funktioniert der java und javac Befehl bzw. der Programmaufruf bei Mac OS Catalina auch ohne das ich die PATH Variable setze das würde mich brennend interessieren? In keinem mir bekannten Tutorial wird diese gesetzt nur in einem Artikel bei stackoverflow.com stand dies.
 
Zuletzt bearbeitet:
K

kneitzel

Gast
Also Linux hat ein System, bei dem das über eine Art Proxy gemacht wird. Alternatives heisst das.
Die Linux Packages, die ein JDK installieren, nutzen dies. Daher ist ein java / javac in /usr/bin vorhanden und /usr/bin ist bereits im Path enthalten.

Beim Mac müsste man schauen, was da der Installer macht. Der Installer setzt auch gewisse Dinge bei der Installation.

Eine Installation muss aber nicht immer so stattfinden. Ich nutze sehr oft einfach nur ein ZIP File, welches ich dann entpacke. Und da sind dann gewisse Schritte manuell notwendig. So kann man PATH und JAVA_HOME setzen. Man ann aber unter Linux auch manuell die alternatives setzen:
 

httpdigest

Top Contributor
Also Linux hat ein System, bei dem das über eine Art Proxy gemacht wird. Alternatives heisst das.
@gsmv4 Jupp, letztlich nutzt Linux symbolische Links im Dateisystem. Du kannst z.B. mal `whereis java` in der Kommandozeile aufrufen (ich denke, das gibt es auch unter Mac OS) (whereis geht selber nur die PATH Variable durch und sagt dir, unter welchem Pfad dort das Programm gefunden wurde und aufgerufen werden würde):
Code:
user@hostname:~$ whereis java
java: /usr/bin/java /usr/share/java /usr/share/man/man1/java.1.gz
user@hostname:~$ ls -la /usr/bin/java
lrwxrwxrwx 1 root root 22 Okt  9  2019 /usr/bin/java -> /etc/alternatives/java
user@hostname:~$ ls -la /etc/alternatives/java
lrwxrwxrwx 1 root root 43 Mai  1 12:41 /etc/alternatives/java -> /usr/lib/jvm/java-14-openjdk-amd64/bin/java
user@hostname:~$
 

gsmv4

Mitglied
Vielen Dank wieder.

Ich habe mal im Ordner /usr/bin nachgeschaut dort habe ich zwei Alias gefunden eines java (mit dem Ziel: /System/Library/Frameworks/JavaVM.framework/Versions/A/Commands/java) und eines javac (mit dem Ziel: /System/Library/Frameworks/JavaVM.framework/Versions/A/Commands/javac) beide Ziele sind aber nicht die Ordner wo das JDK installiert wurde bzw zeigen nicht auf den JAVA_HOME Pfad. Woher kommen diese Dateien?

Wenn ich echo $PATH eingebe erhalte ich folgendes:
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

Wenn ich whereis java eintippe kommt:
/usr/bin/java

Wenn ich whereis javac eintippe kommt:
/usr/bin/javac

Wenn ich mir den Pfad aus dem Tool /usr/libexec/java_home auslesen lasse komme ich auf:
/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home

Die vom JDK installierten java und javac liegen unter:
/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/bin

Bin leider total verwirrt....
 
Zuletzt bearbeitet:
K

kneitzel

Gast
Das, was du da gefunden hast ist einfach erklärt:
Diese symbolischen Links verweisen auf Executables, die dann erst das eigentlich installierte Java starten. Das kenne ich so aber jetzt nur von Oracle Java muss ich gestehen. Ob das andere OpenJDKs auch so machen, müsste ich selbst einmal prüfen.

erläutert das noch etwas mehr.
 

gsmv4

Mitglied
Danke.

Nun bin ich schon wieder etwas weiter mit meinem Verständnis;)
Was mache ich jetzt aber wenn ich mehrere JDK's installiert habe wie kann ich dann hin und her wechseln?

Im Internet habe ich diese Lösung gefunden:

export JAVA_8_HOME=$(/usr/libexec/java_home -v1.8)
export JAVA_11_HOME=$(/usr/libexec/java_home -v11)
Add alias for quick change:

alias java8='export JAVA_HOME=$JAVA_8_HOME'
alias java11='export JAVA_HOME=$JAVA_11_HOME'
set default to Java 11

java11
export PATH

export PATH=$JAVA_HOME/bin:$PATH

doch wenn ich dann whereis java oder whereis javac eingebe bekomme ich:
/usr/bin/java bzw. /usr/bin/javac

erwarten würde ich dadurch das ich jetzt in der PATH Variablen den direkten Pfad zum JDK gelegt habe halt auch den Pfad angezeigt zu bekommen... weiß jemand warum dies nicht der Fall ist?
 
K

kneitzel

Gast
Eine Umgebungsvariable ist etwas statisches. Das ändern einer Variable ändert nicht eine andere. Wenn du den Path anpassen möchtest, dann musst du den auch aktiv setzen.

Aber der java Wrapper, der durch /usr/bin/java gestartet wird, wird JAVA_HOME evtl. auswerten und nutzen. Das würde erklären, dass das Setzen von der einen Variable ausreicht, um die Java Version zu wechseln. Habe aber jetzt keinen Mac zum Testen zur Hand.
 

gsmv4

Mitglied
Eine Umgebungsvariable ist etwas statisches. Das ändern einer Variable ändert nicht eine andere. Wenn du den Path anpassen möchtest, dann musst du den auch aktiv setzen.

Aber der java Wrapper, der durch /usr/bin/java gestartet wird, wird JAVA_HOME evtl. auswerten und nutzen. Das würde erklären, dass das Setzen von der einen Variable ausreicht, um die Java Version zu wechseln. Habe aber jetzt keinen Mac zum Testen zur Hand.


"whereis geht selber nur die PATH Variable durch und sagt dir, unter welchem Pfad dort das Programm gefunden wurde und aufgerufen werden würde"

Dann müsste er aber doch auch meine Angabe zum JDK anzeigen denn mein PATH sieht so aus:
/opt/apache-maven/bin:/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/bin (Dort befindet sich vom JDK die java und die javac)

Gibt es eine Reihenfolge die beachtet wird wenn durch die Path Variable ein Programm etc gesucht wird bzw wo fängt er an zu suchen?

Das wäre jetzt wirklich interessant zu wissen wenn es so ist wie du meinst dann wäre export PATH=$JAVA_HOME/bin:$PATH überflüssig;)
Kann das jemand mit tieferem Verständnis für Mac OS verifizieren?:)
 
Zuletzt bearbeitet:

gsmv4

Mitglied
Danke für die Antwort.

Ich habe mir das mal angesehen dort gibt es nicht die JDK's von Oracle was schonmal sehr schade ist...
Deswegen kommt es für mich wohl nicht in Frage:(

Trotzdem wäre es cool wenn jemand meine vorangegangene Frage noch beantworten könnte;)
 
K

kneitzel

Gast
Welche Nachteile hat das denn?
Wenn die Firma da entsprechende Support-Verträge und Lizenzen hat, dann sehe ich da kein Problem, das Dich direkt betreffen dürfte. Aber da muss man halt die Lizenz genau beachten und ggf. auch ordentlich Geld abdrücken....

Aber je nachdem, was man macht / braucht ist es üblich ....
 

gsmv4

Mitglied
Um nochmal zu meiner Frage zurückzukommen:
Macht es Sinn bei Mac OS Catalina in der Config Datei der zshell dies zu setzen:
export PATH=$JAVA_HOME/bin:$PATH

Oder ist das überflüssig... Vor allem würde ich das gerne wissen da ich zwei JDK's nutzen muss das 8er und das 11er.
Kann das jemand mit tieferem Verständnis für Mac OS verifizieren?:)
 
K

kneitzel

Gast
Also ich habe das nicht, denn ich nutze Java ja nicht wirklich auf der Kommandozeile. Da habe ich einfach ein 11er als Default über die Installation.

Die Entwicklung mit unterschiedlichen JDKs macht alles die IDE. Da habe ich die JDKs einfach als ZIP File entpackt und das halt dann in der IDE angegeben.

Die Frage ist halt, was du wie genau machen willst. Aber wenn du wechseln willst, dann sind kleine Scripte eher sinnvoll, die das gewünschte JDK setzen. Denn sonst passt du die Config Datei an und startest eine neue Shell?

Und du musst mit den Java stub bei Mac OS auch nur JAVA_HOME setzen - statt Script reichen da Aliase ....

Das ist meine Sicht darauf aber da ist recht stark meine Arbeitsweise ausschlaggebend.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Wofür benötigt man ByteBuffer? Java Basics - Anfänger-Themen 5
Fats Waller Wofür stehen diese Konstanten im Java Labyrinth ? Java Basics - Anfänger-Themen 5
J Wofür dienen Interfaces ? Java Basics - Anfänger-Themen 1
F Mehrere Konstruktoren? Wofür? Java Basics - Anfänger-Themen 21
S "%s" oder "%n" - wofür nutzt man das? Java Basics - Anfänger-Themen 4
K Wofür wird heute noch die Stack Klasse in Java genutzt Java Basics - Anfänger-Themen 4
R Wofür abstract? Java Basics - Anfänger-Themen 29
Z This() Wofür Java Basics - Anfänger-Themen 2
T Wofür ist ANT? Java Basics - Anfänger-Themen 5
T Wofür Parser?? Java Basics - Anfänger-Themen 39
V Wofür steht das args / arguments in Main Methode Java Basics - Anfänger-Themen 4
D Was ist ein StringReader und wofür braucht man ihn? Java Basics - Anfänger-Themen 2
N Look & Feel Nimbus wofür? Java Basics - Anfänger-Themen 10
G Wofür com package? + Welche eclipse - Plug Ins? Java Basics - Anfänger-Themen 3
K java syntax: wofür steht super(screen)? Java Basics - Anfänger-Themen 5
J Wofür steht \r? Java Basics - Anfänger-Themen 7
D argv Warum? Wofür? Weshalb? Java Basics - Anfänger-Themen 2
berserkerdq2 Wozu benötigt man den BiPredicate, kann ich nicht einfach eine normale Methode nutzen, statt BiPredicate? Java Basics - Anfänger-Themen 3
I BLOB / CLOB und Hibernate... Ratschläge benötigt Java Basics - Anfänger-Themen 10
B Regex Kombination benötigt Java Basics - Anfänger-Themen 5
I REST Api / JAX-RS, Swagger (OpenAPI) - generelle Starthilfen benötigt Java Basics - Anfänger-Themen 15
D Codeblöcke, die immer wieder im Programmverlauf benötigt werden Java Basics - Anfänger-Themen 5
Gaudimagspam Dringend Java Hilfe benötigt Java Basics - Anfänger-Themen 19
P Methode die eigentlich einen Scanner benötigt mit toString() Java Basics - Anfänger-Themen 5
L Kleine Hilfe beim Schreiben eines Programmes benötigt :D Java Basics - Anfänger-Themen 40
B Denkanstoß benötigt: Emails an bestimmte Emailadresse schicken Java Basics - Anfänger-Themen 6
S Schnelle Hilfe bei 2 kurzen Aufgaben benötigt Java Basics - Anfänger-Themen 2
M Klassen Klassendiagramm - Hilfe benötigt Java Basics - Anfänger-Themen 0
N Zeit berechnen, die für eine Strecke benötigt wird Java Basics - Anfänger-Themen 3
I Programmierung-Hausaufgabe: Hilfe benötigt Java Basics - Anfänger-Themen 8
B Kleine Erklärung zu einer Codezeile benötigt Java Basics - Anfänger-Themen 5
R Codeerklärung benötigt Java Basics - Anfänger-Themen 12
S Bisschen hilfe beim Sudoku Lösen benötigt Java Basics - Anfänger-Themen 7
J fileReader: wird dateipfad benötigt? Java Basics - Anfänger-Themen 8
M Denkanstoß für Umlaufzahl dringend benötigt! Java Basics - Anfänger-Themen 9
A for Zähl schleife hilfe benötigt Java Basics - Anfänger-Themen 12
J Anfänger Beispiele benötigt Java Basics - Anfänger-Themen 3
X Mit JSPs anfangen ... Was wird benötigt? Java Basics - Anfänger-Themen 5
C Hilfe bei Schleifen und Basics benötigt Java Basics - Anfänger-Themen 2
M Containerfile benötigt - aber wie? Java Basics - Anfänger-Themen 11
F Hilfe benötigt Java Basics - Anfänger-Themen 7
S 2 regex-Funktionen benötigt Java Basics - Anfänger-Themen 4
M Mails zum Server senden der Authentisierung benötigt Java Basics - Anfänger-Themen 3
D threadfehler: stischer zusamenhang benötigt. Java Basics - Anfänger-Themen 2
nbergmann Umgebungsvariablen einstellen unter Windows 7 klappt nicht Java Basics - Anfänger-Themen 2
F Umgebungsvariable Java Umgebungsvariablen einrichten (win 10) Java Basics - Anfänger-Themen 9
I Properties oder Umgebungsvariablen mit ${irgendwas} lesen? Java Basics - Anfänger-Themen 2
B Win7 + JDK1.5.0 -> Umgebungsvariablen Java Basics - Anfänger-Themen 2
S Umgebungsvariablen unter Windows XP Java Basics - Anfänger-Themen 6
D Umgebungsvariablen im signierten Applet??? Java Basics - Anfänger-Themen 4
C javac, exec, -sourcepath, Umgebungsvariablen Java Basics - Anfänger-Themen 9
C exec Umgebungsvariablen Java Basics - Anfänger-Themen 2
L Windows-Umgebungsvariablen mit Java setzen? Java Basics - Anfänger-Themen 11
G Betriebssystemunabhängig Umgebungsvariablen auslesen Java Basics - Anfänger-Themen 15
D Win98 erkennt keine java Befehle.Umgebungsvariablen falsch? Java Basics - Anfänger-Themen 7
Y Umgebungsvariablen unter Linux Java Basics - Anfänger-Themen 6
S Umgebungsvariablen unter Windows XP Java Basics - Anfänger-Themen 2
C Umgebungsvariablen vor Programmstart ändern??? Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben