{"id":36,"date":"2012-11-19T20:05:05","date_gmt":"2012-11-19T19:05:05","guid":{"rendered":""},"modified":"2018-09-17T21:56:32","modified_gmt":"2018-09-17T19:56:32","slug":"na-ceste-k-java-triedam","status":"publish","type":"post","link":"https:\/\/spireng.sk\/en\/na-ceste-k-java-triedam\/","title":{"rendered":"Na ceste k java triedam"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" class=\"imgp_img\" style=\"float: left; margin: 2px 5px;\" src=\"\/sites\/default\/files\/imagepicker\/1\/dsfasd.jpg\" alt=\"Obr\u00e1zok\" width=\"250\" height=\"167\" \/>Pr\u00e1ve sa sna\u017e\u00edm prehr\u00fdz\u0165 cez knihu Ivors Horton Beginnig Java od (kto by to \u010dakal) Ivora Hortona. Ke\u010f\u017ee to m\u00e1 v n\u00e1zve Beginnig, tak by ste mo\u017eno \u010dakali nejak\u00fa men\u0161iu knihu na rozbeh v danej t\u00e9me. Pr\u00edbeh Javy je ale dos\u0165 dlh\u00fd a asi aj preto m\u00e1 t\u00e1to za\u010diato\u010dn\u00edcka kniha prili\u017ene 1150 str\u00e1n. Mysl\u00edm, \u017ee za\u010diato\u010dn\u00edcke knihy s po\u010dtom str\u00e1n nad 1000 by mali zak\u00e1za\u0165. Niekto by sa mohol z\u013eakn\u00fa\u0165 a preberanej t\u00e9me sa rad\u0161ej vyhn\u00fa\u0165. \u010co sa t\u00fdka Javy, tak bezosporu je o \u010dom rozpr\u00e1va\u0165 a jedna z vec\u00ed, ktor\u00e1 mne a\u017e doteraz nebola \u00faplne jasn\u00e1, je to, ako vlastne funguje Java Class Path. Po\u010fme sa na to pozrie\u0165.<!--more--><\/p>\n<p><!--break-->Ve\u013ek\u00fa \u010das\u0165 svojho profesn\u00e9ho \u017eivota som str\u00e1vil v svete .Net-u. Z poh\u013eadu z\u00e1vislost\u00ed medzi kni\u017enicami je to n\u00e1dhern\u00fd, jednoduch\u00fd, statick\u00fd svet. Ak m\u00e1te projekt vo Visual Studiu a chcete, aby vyu\u017e\u00edval in\u00fa kni\u017enicu, tak sta\u010d\u00ed vytvori\u0165 z\u00e1vislos\u0165 na t\u00fato kni\u017enicu. Visual Studio potom pri ka\u017edom zostaven\u00ed aplik\u00e1cie skop\u00edruje dan\u00fa kni\u017enicu k v\u00fdsledku zostavenia a automatick\u00fd syst\u00e9m h\u013eadania kni\u017en\u00edc, ktor\u00fd v .Net-e je, ju n\u00e1jde (jeden z miest, kam sa pozer\u00e1, je lok\u00e1lny prie\u010dinok pri sp\u00fa\u0161\u0165anej aplik\u00e1cii). E\u0161te jednoduch\u0161ie je, ak pou\u017e\u00edvate kni\u017enicu, ktor\u00e1 sa in\u0161taluje do Global Assembly Cache (GAC). Vtedy sta\u010d\u00ed vytvori\u0165 z\u00e1vislos\u0165 do GAC a .Net tak kni\u017enicu v\u017edy n\u00e1jde. A e\u0161te dod\u00e1m, \u017ee assembly (t.j. kni\u017enica v .Net-e) je tak\u00fd kontajner na triedy a sta\u010d\u00ed v\u00e1m odkaz na t\u00fato kni\u017enicu a m\u00e1te k dispoz\u00edcii v\u0161etky jej triedy (vo v\u0161etk\u00fdch menn\u00fdch priestoroch danej assembly).<\/p>\n<p>No a Java to m\u00e1 trochu inak. Vlastne by sa dalo poveda\u0165, \u017ee t\u00fdch rozdielov je viac. Hne\u010f ako sa pok\u00fasite prelo\u017ei\u0165 prv\u00fa javovsk\u00fa aplik\u00e1ciu, ktor\u00e1 vy\u017eaduje nejak\u00fd bal\u00edk (niektor\u00e1 z tried ho importuje), m\u00f4\u017eete sa stretn\u00fa\u0165 s v\u00fdnimkou kompil\u00e1cie ClassNotFoundException. To znamen\u00e1, \u017ee kompil\u00e1tor javy pri preklade nena\u0161iel dan\u00fa triedu vo v\u0161etk\u00fdch bal\u00edkoch dostupn\u00fdch pri preklade. Ako ich ale h\u013eadal? Odpove\u010f je jednoduch\u00e1. Preh\u013ead\u00e1val takzvan\u00fa Java Class Path (JCP).<\/p>\n<p>Java Class Path je n\u00e1zov pre zoznam ciest k prie\u010dinkom, kde by mali by\u0165 importovan\u00e9 bal\u00edky. To znamen\u00e1, \u017ee ke\u010f sa sna\u017e\u00edte prelo\u017ei\u0165 aplik\u00e1ciu, mus\u00edte jej da\u0165 t\u00fato sadu ciest a ona sa pok\u00fa\u0161a v t\u00fdchto cest\u00e1ch h\u013eada\u0165. Ak jej \u017eiadnu cestu nezad\u00e1te, tak automaticky berie ako cestu \u201e.\u201c, \u010do je aktu\u00e1lny prie\u010dinok. Tu by sa to mohlo za\u010da\u0165 podoba\u0165 na .Net, ale to len na chv\u00ed\u013eu. Probl\u00e9m je toti\u017e v tom, \u017ee triedy v bal\u00edkoch musia by\u0165 umiestnen\u00e9 v rovnak\u00fdch podprie\u010dinkoch, ako je zlo\u017een\u00fd n\u00e1zov bal\u00edku. Teda ak do svojej aplik\u00e1cie zap\u00ed\u0161em<\/p>\n<p style=\"padding-left: 30px;\"><code> import sk.spireng.mojbalik.kalkulacka;<\/code><\/p>\n<p>tak trieda <em>kalkulacka<\/em> mus\u00ed by\u0165 umiestnen\u00e1 v adres\u00e1ri <em>mojbalik<\/em>, ten zase v adres\u00e1ri <em>spireng<\/em> a ten v adres\u00e1ri <em>sk<\/em>. Cel\u00e9 to mus\u00ed na chlp sedie\u0165. Tak\u017ee v prie\u010dinku, kde m\u00e1te prekladan\u00fa triedu, by ste mali ma\u0165 podprie\u010dinky s importovan\u00fdmi bal\u00edkmi. Alebo ich m\u00f4\u017eete ma\u0165 niekde na disku, ale vtedy mus\u00edte ma\u0165 spr\u00e1vne nastaven\u00fa JCP. A tu prich\u00e1dza jedna z\u00e1ludnos\u0165. T\u00e1 cesta nesmie ukazova\u0165 do niektor\u00e9ho podprie\u010dinka k triede <em>kalkulacka<\/em>. Mus\u00ed ukazova\u0165 pr\u00e1ve na adres\u00e1r, v ktorom je umiestnen\u00fd adres\u00e1r <em>sk<\/em>. Kompil\u00e1tor javy toti\u017e vezme cestu v JCP a jednoducho k nej pripoj\u00ed zlo\u017een\u00fd n\u00e1zov bal\u00edka a pozrie sa, \u010di existuje tak\u00fd s\u00fabor (ke\u010f\u017ee posledn\u00fd pojem je trieda, \u010do na disku predstavuje .class s\u00fabor). Ak tak\u00fd nen\u00e1jde, vyhl\u00e1si ClassNotFoundException. Preto treba by\u0165 pri zad\u00e1van\u00ed cesty opatrn\u00fd, lebo sta\u010d\u00ed aj mal\u00fd omyl a trieda sa nen\u00e1jde.<\/p>\n<p>Podobne ako funguje kompil\u00e1tor javy (teda <em>javac<\/em>), funguj\u00fa aj \u010fal\u0161ie dva d\u00f4le\u017eit\u00e9 programy <em>java<\/em> (interpreter) a <em>javadoc<\/em> (gener\u00e1tor dokument\u00e1cie). T\u00e1 podobnos\u0165 je dokonca aj v pou\u017e\u00edvan\u00ed JCP. Aj interpreter potrebuje vedie\u0165, kde h\u013eada\u0165 ostatn\u00e9 triedy, ktor\u00e9 s\u00fa pou\u017e\u00edvan\u00e9 sp\u00fa\u0161\u0165anou aplik\u00e1ciou. Rozdiel medzi interpreterom a preklada\u010dom je v tom, \u017ee preklada\u010d je ako kombajn, ktor\u00e9mu viete tieto z\u00e1vislosti podhodi\u0165 aj vo forme .java s\u00faborov, aj vo forme .class s\u00faborov, zatia\u013e \u010do interpreter potrebuje u\u017e prelo\u017een\u00e9 .class s\u00fabory. Preklada\u010d si toti\u017e .java s\u00fabory vie prelo\u017ei\u0165, a tak si z nich vie vyrobi\u0165 .class, zatia\u013e\u010do interpreter nie. Gener\u00e1tor dokument\u00e1cie javadoc je tret\u00ed program, ktor\u00fd potrebuje spr\u00e1vne nastaven\u00fa JCP. Pre neho by ste tie\u017e mali ma\u0165 prichystan\u00e9 u\u017e .class s\u00fabory. Posledn\u00fa vec, ktor\u00fa treba doda\u0165 je, \u017ee na cest\u00e1ch JCP sa m\u00f4\u017eu nach\u00e1dza\u0165 aj JAR s\u00fabory (Java ARchive), ktor\u00e9 obsahuj\u00fa potrebn\u00e9 triedy. Samozrejme triedy v t\u00fdchto JAR s\u00faboroch musia by\u0165 ulo\u017een\u00e9 v spr\u00e1vnych podprie\u010dinkoch, ako som pop\u00edsal vy\u0161\u0161ie.<\/p>\n<p>Javovsk\u00fd svet je oproti tomu .Net-ovsk\u00e9mu omnoho viac modul\u00e1rny, dynamick\u00fd a slabov\u00e4zobn\u00fd. Definovanie presnej Java Class Path so s\u00fabormi umiestnen\u00fdmi kdeko\u013evek na disku, to \u017ee viete podhodi\u0165 neprelo\u017een\u00e9 z\u00e1vislosti (.java s\u00fabory), aj to, \u017ee je to nutn\u00e9 definova\u0165 aj pri sp\u00fa\u0161\u0165an\u00ed aplik\u00e1cie alebo generovan\u00ed dokument\u00e1cie len posil\u0148uj\u00fa t\u00fato modularitu a dynamickos\u0165 (\u0161trukt\u00fara rozlo\u017eenia bal\u00edkov na disku m\u00e1 \u0161ir\u0161ie mo\u017enosti ako pri .Net-e). Je to ale tie\u017e \u00faskalie, do ktor\u00e9ho spadne asi ka\u017ed\u00fd za\u010d\u00ednaj\u00faci Java program\u00e1tor. Na\u0161\u0165astie sa to d\u00e1 celkom pekne rozpozna\u0165 pomocou vyhradenej v\u00fdnimky ClassNotFoundException. V takom pr\u00edpade treba len venova\u0165 chv\u00ed\u013eu pochopeniu princ\u00edpov a spr\u00e1vnemu nastaveniu Java Class Path.<\/p>","protected":false},"excerpt":{"rendered":"<p>Pr\u00e1ve sa sna\u017e\u00edm prehr\u00fdz\u0165 cez knihu Ivors Horton Beginnig Java od (kto by to \u010dakal) Ivora Hortona. Ke\u010f\u017ee to m\u00e1 v n\u00e1zve Beginnig, tak by ste mo\u017eno \u010dakali nejak\u00fa men\u0161iu knihu na rozbeh v danej t\u00e9me. Pr\u00edbeh Javy je ale dos\u0165 dlh\u00fd a asi aj preto m\u00e1 t\u00e1to za\u010diato\u010dn\u00edcka kniha prili\u017ene 1150 str\u00e1n. Mysl\u00edm, \u017ee [&hellip;]<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[13],"tags":[],"class_list":["post-36","post","type-post","status-publish","format-standard","hentry","category-vyvoj-softveru"],"_links":{"self":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts\/36","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/comments?post=36"}],"version-history":[{"count":1,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts\/36\/revisions"}],"predecessor-version":[{"id":208,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts\/36\/revisions\/208"}],"wp:attachment":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/media?parent=36"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/categories?post=36"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/tags?post=36"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}