Java kompilácie a build v príkazovom riadku - library a použitia
V tomto Java tutoriále si vykonáme rozšírenie základných znalostí, ktoré sme sa pri predviedli v predchádzajúcich dieloch. V prvej časti vytvoríme nespustiteľné jar, čo znamená, že vytvoríme knižnicu (library) a v ďalšej časti si opäť vytvoríme spustiteľný jar, ktorý bude využívať metódy obsiahnuté v nami vytvorené knižnici. Z pohľadu natívneho jazyka je to podobné ako * .dll. Výhoda knižníc je tá, že môžete edivat (prípadne rozširovať) len niektoré časti kódu, napr. Tie umiestnené v knižnici, bez toho aby ste buildovali celú aplikáciu znova.
Vytvorenie knižnice (nespustiteľné jar)
Vyrobíme si knižnicu s dvoma balíčky. Každý balíček bude obsahovať len 1 triedu. Prvá trieda bude obsahovať jednu metódu a druhá trieda metódy dve. Knižnica môže samozrejme obsahovať desiatky, stovky, tisíce balíčkov a každý balíček desiatky, stovky, tisíce tried. Maximálny počet metód v triede je 65535.
Ako prvý nás čaká vytvorenie vhodného adresára Knihovna
, v
ňom vytvoríme vhodné podadresáre pre dva balíčky balicek1
a
balicek2
. Do každého balíčka vytvoríme súbor, ktorý
predstavuje našej triedu. Rovnaký spôsobom v balíka1 vytvoríme súbor pre
zdrojový kód ProgramBalicek1.java
príkazom
fsutil file createnew ProgramBalicek1.java 0
. Opakujeme aj pre
balicek2
kde je trieda ProgramBalicek2.java
príkazom
fsutil file createnew ProgramBalicek2.java 0
.
D:\ └── Knihovna ├── balicek1 │ └── ProgramBalicek1.java └── balicek2 └── ProgramBalicek2.java
Dané súbory otvoríme v Notepade a do daných súborov vložíme tieto zdrojové kódy. Súbory samozrejme uložíme.
Obsah triedy ProgramBalicek1
package balicek1; public class ProgramBalicek1 { public String ziskejText() { return "Zde je muj text"; } public int secti(int a, int b) { return (a + b); } }
Obsah triedy ProgramBalicek2
package balicek2; public class ProgramBalicek2 { public String ziskejText(String in) { return "Poslali jste tento retezec : " + in; } }
Po uložení sa presunieme o úroveň vyššie a zdrojové kódy skompilujeme cez príkazy:
javac balicek1\*.java
a
javac balicek2\*.java
Potom vykonáme kontrolné výpis adresárov, aby sme zistili, či sa kompilácie podarila. Vznikli súbory * .class, takže zdrojové kódy sa úspešné skompilovali.
D:\ └── Knihovna ├── balicek1 │ ├── ProgramBalicek1.class │ └── ProgramBalicek1.java └── balicek2 ├── ProgramBalicek2.class └── ProgramBalicek2.java
Potom nás už len čaká tvorba konfiguračného súboru (manifestu)
príkazom fsutil file createnew manifest.man 0
, do ktorého
vložíme tento obsah. Potom vykonáme export do jar príkazom
jar cmf manifest.man Knihovna.jar balicek1\*.class balicek2\*.class
Ako vidíte, jedná sa o nespustiteľné triedy, chýba tu trieda sa
spúšťací metódou main()
.
Manifest-Version: 1.0 Created-By: 1.8.0_144 (Oracle Corporation)
postup:
Teraz sme úspešne vytvorili externé jar, ktorý nie je spustiteľný.
D:\ └── Knihovna ├── Knihovna.jar ├── manifest.man ├── balicek1 │ ├── ProgramBalicek1.class │ └── ProgramBalicek1.java └── balicek2 ├── ProgramBalicek2.class └── ProgramBalicek2.java
Vytvorenie aplikácie s knižnicou (external jar)
D:\ └── Program └── prog └── Program.java
Opäť nás čaká vytvorenie vhodného adresára Program
, v
ňom vytvoríme vhodný podadresár prog
pre balík, vytvoríme
zdrojový súbor Program.java
príkazom
fsutil file createnew Program.java 0
, do ktorého vložíme náš
zdrojový kód opäť napr. Cez Notepad príkazom
notepad Program.java
.
package prog; import balicek1.*; import balicek2.*; public class Program { public static void main (String [] args) { System.out.println("Start Programu"); ProgramBalicek1 instance1 = new ProgramBalicek1(); System.out.println("Zde je ziskany text : "+instance1.ziskejText()); System.out.println("Zde je soucet 4 a 5 : "+instance1.secti(4,5)); ProgramBalicek2 instance2 = new ProgramBalicek2(); System.out.println("Zde je ziskany text : "+instance2.ziskejText("Ahoj")); System.out.println("Konec Programu"); } }
Pre úspešnú kompiláciu je potreba daná knižnica a preto ju skopírujeme
príkazom (alternatívne súborovým manažérom)
copy D:\Knihovna\Knihovna.jar D:\Program ` z původního adresáře do našeho aktuálního adresáře (cesty si upravte podle svého umístění). Nyní přichází na řadu kompilace příkazem `javac -cp Knihovna.jar prog\Program.java
.
D:\ └── Program ├── Knihovna.jar └── prog ├── Program.class └── Program.java
Po úspešnom skompilovaniu si program spustíme
java -cp .;Knihovna.jar prog.Program
.
Teraz nás zas čaká tvorba spustiteľného jar súboru. Vytvoríme si
súbor manifestu cez príkaz
fsutil file createnew manifest.man 0
.
D:\ └── Program ├── manifest.man ├── Knihovna.jar └── prog ├── Program.class └── Program.java
Ďalej vykonáme úpravu daného manifestu cez príkaz
notepad manifest.man
, súbor uložíme a Notepad ukončíme.
Manifest-Version: 1.0 Class-Path: Knihovna.jar Main-Class: prog.Program Created-By: 1.8.0_144 (Oracle Corporation)
Build čiže stvorenia spustiteľného projektu vykonáme príkaz:
jar cmf manifest.man Program.jar prog\*.class
Ako vidíte, vytvorili sme Program.jar
. No a teraz si daný
program spustíme.
D:\ └── Program ├── Program.jar ├── manifest.man ├── Knihovna.jar └── prog ├── Program.class └── Program.java
Spustenie v príkazovom riadku ide buď ako
java -jar Program.jar
alebo ako
java -cp Program.jar prog.Program
.
Všetko ako vidíte funguje. Nešikovnosť tohto riešenia je, že knižnica musí byť na rovnakej úrovni adresárovej štruktúry ako spúšťací program. Samozrejme si možno v manifeste nastaviť inej adresárovej umiestnenie, ale je nutné dané umiestnenie dodržiavať, inak program prestane fungovať.
Existujú rôzne varianty ako tento možný problém riešiť, napr .:
- Môžeme nakopírovať danú knižnicu do jre
\ lib \ ext spúšťacieho JRE, to jest napr. Do
C:\Program Files\JavaJRE\jre\lib\ext
, potom by knižnica mala byť načítaná všade pre každý projekt. Všetky knižnice umiestnené v tomto adresári JVM načíta do CLASSPATH a triedy v týchto * .jar sú dostupné. Toto však funguje u starších Java 8, 7, 6, ... a v novších Java 9, 10 táto funkcia nie je podporovaná. - Prípadne možno skompilované balíčky a triedy v nich umiestnenej (tzv. *
.Class) vyextrahovať
a vložiť do nášho spustiteľného * .jar. Cez príkaz
jar xf Knihovna.jar balicek1
získame adresárbalicek1
s * .class súbory a tie pridáme do spustiteľného súboru doProgram.jar
jar uf Program.jar balicek1
. - Alebo najťažšie variant je pridať externý jar do spustiteľného jar a v spustiteľnom jar si naprogramovať ClassLoader, ktorý daný jar načíta do CLASSPATH.
Záver
Toto je zhruba všetko, čo je vhodné vedieť (poznať), ak chcete pracovať v príkazovom riadku bez IDE. Ide to, ale ako som v úvode napísal, lepšie je rozhodne IDE používať. Najvhodnejšie IDE sú podľa rozšírenosti Eclipse, NetBeans a IntelliJ IDEA. Eclipse je absolútne zadarmo ako pre SE tak i EE. NetBeans 8.2 podporuje iba do vr. Java 8, pre Javu 9, príp. 10, 11 je nutné použiť vývojársky build (development build) a budúcnosť NetBeans nevyzerá optimisticky sa plánovanej zmeny licenčnej politiky Oracle u Javy. IntelliJ IDEA je free pre SE a pre EE sa musí kupovať. Ďalšie IDE sú napr. BlueJ alebo JDeveloper.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkamiStiahnuté 505x (5.37 kB)