Java kompilace a build v příkazovém řádku - library a užití

Java Pro pokročilé Java kompilace a build v příkazovém řádku - library a užití

ONEbit hosting Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

V tomto Java tutoriálu si provedeme rozšíření základních znalostí, které jsme se při předvedli v předchozích dílech. 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.

Vytvoření jar knihovny v Javě přes příkazovou řádku

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. 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:

Vytvoření jar knihovny v Javě přes příkazovou řádku

Nyní jsme úspěšně vytvořili externí jar, jenž není spustitelný.

Vytvoření aplikace s knihovnou(external jar)

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. Po úspěšném zkompilování si program spustíme java -cp .;Knihovna.jar prog.Program.

Kompilace knihovny v Javě přes příkazovou řádku

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á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. Spuštění v příkazovém řádku jde buď jako java -jar Program.jar nebo jako java -cp Program.jar prog.Program.

Spuštění Java programu s knihovnou z příkazové řádky

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 do Program.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.


 

Stáhnout

Staženo 22x (5.37 kB)

 

 

Článek pro vás napsal Robert Michalovič
Avatar
Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!
Programuji převážně v Javě SE,EE a trochu nativním C a CUDA. více viz.https://cz.linkedin.com/in/robert-michalovi%C4%8D-8a9b9498
Aktivity (2)

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!