IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

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
Vytvorenie jar knižnice v Jave cez príkazový riadok - Java - Pre pokročilých

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:

Vytvorenie jar knižnice v Jave cez príkazový riadok - Java - Pre pokročilých

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.

Kompilácia knižnice v Jave cez príkazový riadok - Java - Pre pokročilých

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.

Spustenie Java programu s knižnicou z príkazového riadku - Java - Pre pokročilých

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ár balicek1 s * .class súbory a tie pridáme do spustiteľného súboru do Program.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 podmienkami

Stiahnuté 505x (5.37 kB)

 

Všetky články v sekcii
Java - Pre pokročilých
Článok pre vás napísal Robert Michalovič
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
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