Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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
Vytvoření jar knihovny v Javě přes příkazovou řádku - Kompilace manuálně v Javě

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:

Vytvoření jar knihovny v Javě přes příkazovou řádku - Kompilace manuálně v Javě

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.

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

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.

Spuštění Java programu s knihovnou z příkazové řádky - Kompilace manuálně v Javě

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.

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ínkami

Staženo 439x (5.37 kB)

 

Předchozí článek
Java kompilace a build v příkazovém řádku - GUI, balíček
Všechny články v sekci
Kompilace manuálně v Javě
Přeskočit článek
(nedoporučujeme)
Java spuštění - Programové argumenty
Článek pro vás napsal Robert Michalovič
Avatar
Uživatelské hodnocení:
8 hlasů
Programuji převážně v Javě SE,EE a trochu nativním C a CUDA. více viz.https://cz.linkedin.com/in/robert-michalovic
Aktivity