Skip to content

Instantly share code, notes, and snippets.

@busla
Last active January 15, 2021 21:29
Show Gist options
  • Save busla/56e36fe134a1228ffee880540cf96e64 to your computer and use it in GitHub Desktop.
Save busla/56e36fe134a1228ffee880540cf96e64 to your computer and use it in GitHub Desktop.
Java: skelin, $PATH og $CLASSPATH

Ákvað að taka aðeins saman þessa uppsetningu ef einhver getur nýtt sér.

Athugið að þetta nær aðeins yfir MacOS og Linux því miður en sama aðferð er notuð á Windows en ég hef ekki hugmynd um hvar hlutirnir þar eru staðsettir.

Orðið forrit í eftirfarandi samhengi á við kóða sem hefur verið þýddur(compile-aður) í keyranlega skrá. Orðið skel verður notað sem samheiti yfir allar helstu tegundir skelja sem eru í notkun (sh, bash, zsh, o.s.f.v.)

Keyranleg forrit í skelinni geta verið staðsett í hinum og þessum möppum. Þegar heiti á keyranlegri skrá er sleginn inn í skelinni þá þarf skráin að vera til staðar í möppunni sem heitið er slegið inn. Skelin reynir ekki að leita að skrá með þessu heiti á allri vélinni.

En það væri frekar glatað að þurfa að vita nákvæmlega hvar öll forrit væru staðsett og þurfa svo að auki að cd-a sig inn í möppuna þar sem forritið væri til að keyra það.

Til að leysa þetta vandamál þá er slóðum að möppum sem innihalda keyranleg forrit safnað saman í einn langan streng og : notaður til að aðskilja slóðirnar.

Dæmi:

/home/levy/.cargo/bin:/home/levy/.pyenv/bin:/home/levy/.yarn/bin:/home/levy/.poetry/bin:/home/levy/.nvm/versions/node/v14.0.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/go/bin:/usr/local/go/bin

Í hverri möppu í þessum langa streng eru eitt eða fleiri forrit sem hægt er að keyra með því að slá inn heitið á skránni sjálfri.

Skel er ekkert annað en forritunarumhverfi, þ.e. þið getið búið til breytur, for lykkjur og fleira í sh (eða bash) málinu. Í hvert sinn sem þið opnið skel þá fáiði gefins allskyns umhverfisbreytur (environment variables) sem skelin notar til að auðvelda sér lífið.

Ef þið opnið skel og skrifið env þá sjáiði haug af breytum sem innihalda allskyns stillingar fyrir skelina. Ein af þessum breytum er PATH (vísað í hana með $PATH). Eins og kom fram ofar þá leitar skelin fyrst í möppunni sem þú ert staðsett/ur í þegar þú slærð inn heiti á forriti til að keyra. Ef skráin finnst ekki í möppunni þá er athugað í allar möppurnar sem eru í $PATH strengnum. Þannig má keyra öll forrit sem eru uppsett á vélinni hvar sem þú ert í skráartrénu svo lengi sem full slóð að möppunni sem skráin er í sé í $PATH strengnum.

Dæmi: Þið eruð líklega með annaðhvort Firefox eða Chrome á vélinni ykkar og þau má keyra beint úr skelinni eins og önnur forrit með því að slá inn heitið á keyranlegu skránum.

Getið byrjað að kanna hvar í skráartrénu þau eru:

which google-chrome
# eða
which firefox
# prentar út /usr/bin/firefox

Firefox á minni vél er í möppunni /usr/bin og ef ég skoða $PATH breytuna hérna að ofan þá er mappan þar. Ég veit því að skelinn getur keyrt þessa skrá hvar sem ég er skráartrénu. Ég þarf ekki að fara inn í möppuna fyrst.

# óþarfi því þessi mappa er í $PATH
cd /usr/bin

Þið getið svo prófað að keyra þetta beint úr skelinni:

google-chrome

eða

firefox

Ok, þá er það $CLASSPATH sem er líka umhverfisbreyta en þarf að vera til staðar sérstaklega fyrir java. Java veit slóðina að öllum standard klösum sem koma með uppsetningunni og við höfum verið að nota t.d. System í System.out.print('foo'). Ef við ætlum að bæta við pökkum sem fylgja ekki með í uppsetningunni og innihalda klasa sem við viljum nota, t.d. StdDraw, þá þarf að segja Java hver slóðin að þeim er. Það má gera með því að setja slóðina í $CLASSPATH umhverfisbreytuna eða setja slóðina sem option -cp (classpath) þegar t.d. Ugla.java er keyrð.

Sem dæmi þá myndi ég keyra skránna svona á minni vél:

java -cp /home/levy/code/java/libs/algs4.jar ~/Dropbox/hi/2021/vor/TOL203G/skilaverkefni/java/src/Ugla.java

Eða stytta mér leið með því að nota tildu ~ sem er flýtileið að hæmasvæðinu mínu /home/levy

java -cp ~/code/java/libs/algs4.jar ~/Dropbox/hi/2021/vor/TOL203G/skilaverkefni/java/src/Ugla.java

Við getum breytt og bætt við umhverfisbreytum eins og við viljum, rétt eins og við gerum í klösum og föllum sem við skrifum.

Ef t.d. $CLASSPATH finnst ekki í skeljarumhverfinu þá myndi ég skilgreina breytuna og gefa henni slóðina að algs4.jar skránni sem gildi:

export CLASSPATH=~/code/java/libs/algs4.jar

Athugum hvort hún sé kominn inn:

env

Hún ætti að birtast þarna í hrúgunni einhverstaðar.

Getum líka athugað hvort einhver tiltekin breyta sé til staðar:

echo $CLASSPATH

Við ættum að fá útprentað gildið á henni.

Svona má setja hvað sem er sem umhverfisbreytu. Ég gæti t.d. set slóð á skilaverkefnamöppuna í TÖL sem umhverfisbreytu:

export TOL=~/Dropbox/hi/2021/vor/TOL203G/skilaverkefni

Og nýtt mér svo hana til að drífa mig inn í möppuna án þess að skrifa þessa löngu slóð:

cd $TOL

En það eru betri leiðir til að gera þetta heldur en með breytum.

Stundum þarf líka að bæta við slóð í breytu sem er nú þegar til, t.d. $PATH, því við viljum ekki stúta henni með nýju gildi, t.d. ef ég væri með keyranlegt forrit á einhverjum fönkí stað.

Gætum t.d. búið til breytu og gefið $PATH nýtt gildi sem væri upprunalega gildið : viðbótargildið.

TOL=~/Dropbox/hi/2021/vor/TOL203G/skilaverkefni
export PATH=$PATH:$TOL

Þegar við setjum umhverfisbreytu í skelina með þessum hætti þá lifir hún eingöngu eins lengi og skelin lifir, þ.e. hún hverfur ef þú lokar skelinni og hún verður aldrei til ef þú opnar nýja skel. Til að festa hana í öllum skeljum sem opnaðar eru þá þarf að setja hana í skrá sem er hlaðinn inn í hvert skipti sem ný skel er opnuð. Þessi skrá heitir misjöfnum nöfnum og oft eru þær nokkrar sem eru hlaðnar inn, þ.e. ein skrá importar annari.

Á Linux er það yfirleitt skráin .bash_profile eða .bashrc sem eru í heimamöppunni, þ.e. ~/.bash_profile en á MacOS þá gæti hún heitið eitthvað annað, ~/.zshrc mögulega þar sem Apple gerði zsh að default skel í síðustu útgáfu, en ég veit það ekki.

Næst þegar skel er opnuð þá verða umhverfisbreyturnar aðgengilegar. Það má einnig keyra source skipunina sem tekur skrá sem argument, og keyrir innihald skráarinnar. Þar sem export er skipun sem tekur umverfisbreytu sem argument þá er línan export CLASSPATH=~/code/java/libs/algs4.jar í skránni ~/.bashrc ekkert annað en skipun sem er keyrð þegar skipunin source .bashrc er keyrð.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment