Lekce 3 - Java kompilace a build v příkazovém řádku - library a užití
V předchozí lekci, Java kompilace a build v příkazovém řádku - GUI, balíček, jsme si ukázali tvorbu Java aplikace, která měla výstup do GUI.
Dnes opět naše znalosti o něco více rozšíříme. V první části vytvoříme nespustitelný jar, což znamená, že vytvoříme knihovnu (library) a v další části si opět vytvoříme spustitelný jar, který bude využívat metody obsažené v námi vytvořené knihovně. Z pohledu nativního jazyka je to podobné jako *.dll. Výhoda knihoven je ta, že můžete edivat (případně rozšiřovat) pouze některé části kódu, např. ty umístěné v knihovně, aniž byste buildovali celou aplikaci znovu.
Vytvoření knihovny (nespustitelný jar)
Vyrobíme si knihovnu se dvěma balíčky. Každý balíček bude obsahovat pouze 1 třídu. První třída bude obsahovat jednu metodu a druhá třída metody dvě. Knihovna může samozřejmě obsahovat desítky, stovky, tisíce balíčků a každý balíček desítky, stovky, tisíce tříd. Maximální počet metod v třídě je 65535.
Jako první nás čeká vytvoření vhodného adresáře
Knihovna, v něm vytvoříme vhodné podadresáře pro dva
balíčky balicek1 a balicek2. Do každého balíčku
vytvoříme soubor, který představuje naší třídu. Stejný způsobem v
balíčku1 vytvoříme soubor pro zdrojový kód
ProgramBalicek1.java příkazem
fsutil file createnew ProgramBalicek1.java 0. Opakujeme i pro
balicek2 kde je třída ProgramBalicek2.java
příkazem fsutil file createnew ProgramBalicek2.java 0.
D:\
└── Knihovna
├── balicek1
│ └── ProgramBalicek1.java
└── balicek2
└── ProgramBalicek2.java

Dané soubory otevřeme v Notepadu a do daných souborů vložíme tyto zdrojové kódy. Soubory samozřejmě uložíme.
Obsah třídy 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 třídy ProgramBalicek2
package balicek2; public class ProgramBalicek2 { public String ziskejText(String in) { return "Poslali jste tento retezec : " + in; } }
Po uložení se přesuneme o úroveň výše a zdrojové kódy zkompilujeme přes příkazy:
javac balicek1\*.java
a
javac balicek2\*.java
Poté provedeme kontrolní výpis adresářů, abychom zjistili, jestli se kompilace povedla. Vznikly soubory *.class, takže zdrojové kódy se úspěšné zkompilovaly.
D:\
└── Knihovna
├── balicek1
│ ├── ProgramBalicek1.class
│ └── ProgramBalicek1.java
└── balicek2
├── ProgramBalicek2.class
└── ProgramBalicek2.java
Poté nás již jen čeká tvorba konfiguračního souboru (manifestu)
příkazem fsutil file createnew manifest.man 0, do kterého
vložíme tento obsah. Poté provedeme export do jar příkazem
jar cmf manifest.man Knihovna.jar balicek1\*.class balicek2\*.class
Jak vidíte, jedná se o nespustitelné třídy, chybí zde třída se
spouštěcí metodou main().
Manifest-Version: 1.0 Created-By: 1.8.0_144 (Oracle Corporation)
Postup:

Nyní jsme úspěšně vytvořili externí jar, jenž není spustitelný.
D:\
└── Knihovna
├── Knihovna.jar
├── manifest.man
├── balicek1
│ ├── ProgramBalicek1.class
│ └── ProgramBalicek1.java
└── balicek2
├── ProgramBalicek2.class
└── ProgramBalicek2.java
Vytvoření aplikace s knihovnou(external jar)
D:\
└── Program
└── prog
└── Program.java
Opět nás čeká vytvoření vhodného adresáře Program, v
něm vytvoříme vhodný podadresář prog pro balíček,
vytvoříme zdrojový soubor Program.java příkazem
fsutil file createnew Program.java 0, do kterého vložíme náš
zdrojový kód opět např. přes Notepad příkazem
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"); } }
Pro úspěšnou kompilaci je potřeba daná knihovna a proto ji zkopírujeme
příkazem (alternativně souborovým manažerem)
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 úspěšném zkompilování si program spustíme
java -cp .;Knihovna.jar prog.Program.

Nyní nás zas čeká tvorba spustitelného jar souboru. Vytvoříme si
soubor manifestu přes příkaz
fsutil file createnew manifest.man 0.
D:\
└── Program
├── manifest.man
├── Knihovna.jar
└── prog
├── Program.class
└── Program.java
Dále provedeme úpravu daného manifestu přes příkaz
notepad manifest.man, soubor 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 neboli stvoření spustitelného projektu provedeme příkaz:
jar cmf manifest.man Program.jar prog\*.class
Jak vidíte, vytvořili jsme Program.jar. No a teď si daný
program spustíme.
D:\
└── Program
├── Program.jar
├── manifest.man
├── Knihovna.jar
└── prog
├── Program.class
└── Program.java
Spuštění v příkazovém řádku jde buď jako
java -jar Program.jar nebo jako
java -cp Program.jar prog.Program.

Všechno jak vidíte funguje. Nešikovnost tohoto řešení je, že knihovna musí být na stejné úrovni adresářové struktury jako spouštěcí program. Samozřejmě si lze v manifestu nastavit jiné adresářové umístnění, ale je nutno dané umístění dodržovat, jinak program přestane fungovat.
Existují různé varianty jak tento možný problém řešit, např.:
- Můžeme nakopírovat danou knihovnu do jre\lib\ext
spouštěcího JRE, to jest např. do
C:\Program Files\JavaJRE\jre\lib\ext, poté by knihovna měla být načtena všude pro každý projekt. Všechny knihovny umístěné v tomto adresáři JVM načte do classpath a třídy v těchto *.jar jsou dostupné. Toto ovšem funguje u starších Java 8, 7, 6, ... a v novějších Java 9, 10 tato funkce není podporovaná. - Případně lze zkompilované balíčky a třídy v nich umístěné (tzv.
*.class) vyextrahovat
a vložit do našeho spustitelného *.jar. Přes příkaz
jar xf Knihovna.jar balicek1získáme adresářbalicek1s *.class soubory a ty přidáme do spustitelného souboru doProgram.jarjar uf Program.jar balicek1. - Nebo nejtěžší varianta je přidat externí jar do spustitelného jar a ve spustitelném jar si naprogramovat Classloader, který daný jar načte do classpath.
Závěr
Toto je zhruba vše, co je vhodné umět (znát), pokud chcete pracovat v příkazovém řádku bez IDE. Jde to, ale jak jsem v úvodu napsal, lepší je rozhodně IDE používat. Nejvhodnější IDE jsou dle rozšířenosti Eclipse, NetBeans a IntelliJ IDEA. Eclipse je absolutně zdarma jak pro SE tak i EE. NetBeans 8.2 podporuje pouze do vč. Java 8, pro Javu 9, příp. 10, 11 je nutno použít vývojářský build (development build) a budoucnost NetBeans nevypadá optimisticky kvůli plánované změně licenční politiky Oracle u Javy. IntelliJ IDEA je free pro SE a pro EE se musí kupovat. Další IDE jsou např. BlueJ nebo JDeveloper.
Příště si v lekci Java spuštění - Programové argumenty předvedeme spuštění s používáním programových argumentů.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkamiStaženo 604x (5.37 kB)

