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 balicek1
získáme adresářbalicek1
s *.class soubory a ty přidáme do spustitelného souboru doProgram.jar
jar 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 557x (5.37 kB)