Java jar multi-paketo kompiliavimas naudojant manifest failą
Parašė ozzWANTED 2009 lapkričio 22 20:11:58
Visų pirma, n00b'ai turėtų įveikti šį etapą(tai būtų įvadas į šį straipsnį):
https://webdnd.com/kaip-sukompiliuoti-ir-paleisti-java-programa,s182

Taigi, šį kartą pabandysiu kiek galima išsamiau papasakoti apie:
[b]1.[/b]"paketų žymėjimą"(sealing packages)
[b]2.[/b] "instrukcijų failus"(manifest files)
[b]3.[/b] Kelių paketų kompiliavimą į jar failą panaudojant manifest failą.
[b]4.[/b] Įeities taško[klasės](entry point) priskyrimą ir perrašymą(overriding)

* Tiems kas nežino, JAR - tai "[b]J[/b]ava [b]Ar[/b]chive", kitaip tariant Java klasių archyvo failas, kuris įtraukia į save visas nurodytas [u]*.class[/u] failų galūnių klases.

Tariame kad turime situaciją:
Mūsų programa turi - 3 paketus ir dvi main klases. Kiekvienas paketas turi po 3 klases:

[b][u]Paketo nr.1 turinys:[/u][/b]

[u]Automobilis.java:[/u]
[code]package autobusu_parkas;
public class Automobilis {
public void vaziuoti() {
// <... DO STH ...>
}
}[/code]

[u]Automobilis.java:[/u]
[code]package autobusu_parkas;
public class Variklis extends Automobilis {
public void pakeisti_alyva() {
// <... DO STH ...>
}
}[/code]

[u]Vairuotas.java:[/u]
[code]package autobusu_parkas;
public class Vairuotojas {
public void vaziuoti() {
// <... DO STH ...>
}
}[/code]

---------------
[b][u]Paketo nr.2 turinys:[/u][/b]

[u]Main.java:[/u]
[code]package troleibusu_parkas;

import autobusu_parkas.*;
import taksi_parkas.*;

public class Main {
public static void main(String[] args) {
System.out.println("Ieitis nr.2");
}
}[/code]

[u]Troleibusas.java:[/u]
[code]package troleibusu_parkas;
public class Troleibusas {
public void vaziuoti() {
// <... DO STH ...>
}
}[/code]


[b][u]Paketo nr.3 turinys:[/u][/b]
[u]Main.java:[/u]
[code]package taksi_parkas;

import autobusu_pakas.*;
import troleibusu_parkas.*;

public class Main {
public static void main(String[] args) {
System.out.println("Ieitis nr.3");
}
}[/code]

[u]Taksi.java:[/u]
[code]package taksi_parkas;
public class Taksi {
public void iskviesti() {
// <... DO STH ...>
}
}[/code]
--------------------------------------


Taigi turime 3 paketus:
[b]autobusu_parkas
troleibusu_parkas
taksi_parkas[/b]

Ir norime sukompiluoti [b]jar[/b] failą, kuriame įeities failas būtų klasė "Main.java".
Kadangi jį turi net du paketas, ir mūsų Java kompiliatorius nežinos kurią klasę mums reikia paleisti, nes turime nustatyti įeities klasę.
Taigi teksto redaktoriumi(pvz. Notepad++) susikuriame naują failą "[b]manifest.txt[/b]" ir jį išsaugome į mūsų programos direktoriją, t.y. ten pat kur ir mūsų programos visi paketai su failais, pvz.:
"C:\mano_java_programos\"

Manifest failas gali turėti nemažai parametrų, bet pagrindiniai būtų šie:

[i][color=red][b]Įeities taškas(entry-point):[/b][/color]
"[b]Main-Class:[/b]" - atitinkamai "paketo_vardas.klasė" arba tiesiog "klasė", jeigu neturime (kelių) paketų. Šiuo parametru nurodome įeities į programą tašką. T.y. kuri kodo dalis bus iškviesta paleidus jar programą.

[color=green][b]Komentarai:[/b][/color]
"[b]X-Comment:[/b]" - manifest failo komentarai

[b][color=navy]JAR archyvų žymėjimas:[/color][/b]
"[b]Sealed:[/b] " - jeigu 'true' - tai visas archyvas pažymėtas.

[color=navy][b]Konkrečių paketų žymėjimas:[/b][/color]
"[b]Name:[/b]" - (ne)pažymėto paketo pavadinimas
"[b]Sealed:[/b]" - true - paketas pažymėtas, false - paketas nepažymėtas.

[Išeities parametras] "[b]Manifest-Version:[/b]" - manifest failo versija. Įprastai: 1.0
[Išeities parametras] "[b]Created-By:[/b]" - 1.6.0 (Sun Microsystems Inc.)[/i]

-----------------

Paketų žymėjimas mums reikalingas tam, jeigu norime būti garantuoti, kad visos klasės pakete yra sukurtos iš to paties kodo šaltinio.

[b]Pastaba:[/b] tekstinis manifest failas turi baigtis LF([i]line feed[/i]) arba CR([i]carriage return[/i]) simboliu.
(n00bams:
[b]LF[/b] - tai naujos eilutės simbolis, trumpiau tariant [Enter] klavišas, pagrindinai Windows terpės simbolis
[b]CR[/b] - tai tas pats naujos eilutės simbolis, tiksliau pavadintas būtų "fiktyvi nauja eilutė". Kažkas panašaus iš praktiškos būtų [Shift]+[Enter] kombinacija MS Word programoje. CR laikomas labiau Macintosh(MAC) standartu.)

Jeigu norime pažymėti/nežymėti konkretaus paketo, manifest.txt faile kiekvienam paketui įrašome, pvz.
[code]Name: programos_paketai/pirmas_paketas/
Sealed: true[/code]

Jeigu norime, kad visi paketai, apibrėžti konkrečiame jar faile būtų pažymėti, užtekta tiesiog manifest failo pradžioje įrašyti eilutę:
[code]Sealed: true[/code]

Ši eilutė reiškia, kad pats JAR failas yra pažymėtas([i]sealed[/i]), t.y. kad visi paketai apibrėžti tame JAR faile yra pažymėti, nebent buvo perrašyti konkrečiam paketui atskirai[prieš tai buvęs pavyzdys]([i]overridden on a per-package basis[/i]).

[color=brown][u]Jeigu norime išskirti vieno žymėjimą:[/u][/color]
tai mūsų "manifest.txt" failas preliminariai turėtų atrodyti taip:
[code]Main-Class: troleibusu_parkas.main
Name: autobusu_parkas/
Sealed: false

Name: trolebusu_parkas/
Sealed: true

Name: taksi_parkas/
Sealed: true

[/code]

Jeigu norime pažymėti visą JAR paketą(JAR sealing),
mūsų "mainfest.txt" failas turėtų atrodyti taip:
[code]Sealed: true

Main-Class: troleibusu_parkas/Main.class

[/code]

Tačiau mūsų programos atveju, ir paprastumo bei aiškumo dėlei nenaudosime nei konkrečių klasių, nei archyvų žymėjimo, todėl būsų manifest.txt failas bus labai elementarus:
[code][color=red][b]Main-Class:[/b][/color] [color=navy][b]troleibusu_parkas[/b][/color]/Main.class

[/code]
[i](Čia mėlynai pažymėtas mūsų pagrindinio paketo pavadinimas, po "/" - pagrindinė to paketo klasė)[/i]

Dar keletas pastabų:
* Kompiliatorius automatiškai sukurs 'default' [b]MANIFEST.MF[/b] failą, kuris bus [b]META-INF[/b] direktorijoje.
* Manifest failas nebūtinas jeigu turime vieną paketą.
* Default manifest failą taip pat galima redaguoti.

----------------
Taigi failus sukūrėme, dabar reikia visą tą programą sukompiliuoti ir paleisti:

Atsidarę CMD(Windows XP) darom:
------------------------------------------
[u][b]1.[/b] Atsidarom java kompiliatoriaus direktoriją:[/u]
[code]cd Program Files\Java\[b]jdk1.6.0_16[/b]\bin[/code]

[u][b]2.[/b] Sukompiliuojama *.java failus į *.class objektus.[/u]
[code]javac C:\mano_java_programos\programa1\autobusus_parkas\*.java C:\mano_java_programos\programa1\troleibusu_parkas\*.java C:\mano_java_programos\programa1\taksi_parkas\*.java[/code]

[u][b]3.[/b] Sukompiliuojame *.class objektus(failus) į *.jar failą.[/u]
[code][b]jar[/b] [color=red][b]cf[/b][/color][color=blue][b]m[/b][/color] [b][color=red]transportas.jar[/color][/b] Manifest.txt autobusu_parkas\*.class troleibusu_parkas\*.class taksi_parkas\*.class[/code]

Arba galime naudoti ne "*.class", o tiesiog '*'(wildcard'ą), jeigu visi failai direktorijoje yra class galūnės:
[code][b]jar[/b] [color=red][b]cf[/b][/color][color=blue][b]m[/b][/color] [b][color=red]transportas.jar[/color][/b] Manifest.txt autobusu_parkas\* troleibusu_parkas\* taksi_parkas\*[/code]

O jeigu norime nurodyti pilną kelią, rašome:
[code][b]jar[/b] [color=red][b]cf[/b][/color][color=blue][b]m[/b][/color] [b][color=red]transportas.jar[/color][/b] Manifest.txt [color=gray]C:\mano_java_programos\[/color]autobusu_parkas\* [color=gray]C:\mano_java_programos\[/color]troleibusu_parkas\* [color=gray]C:\mano_java_programos\[/color]taksi_parkas\*[/code]


* Galimi parametrai:
[b]v[/b] - [i](verbose)[/i] Išvesti į STDOUT informaciją apie kiekvieną failą kuris bus įtrauktas į JAR archyvą.
[b]c [/b]- [i](Create)[/i] nurodome, kad norime sukurti JAR failą.
[b]f[/b] - [i](File)[/i] nurodome, kad norime gauti rezultatą į failą, vietoje to kad gautume jį į konsolės(cmd) ekraną(STDOUT).
[b]0[/b] - [i](0 compression)[/i] netaikyti duomenų suspaudimo JAR failui.
[b]m[/b] - [i](manifest)[/i] nurodome, kad informacija imsime iš '[u]manifest[/u]' failo.
[b]M[/b] - (eMpty manifest) nurodome, kad nebūtų sukurtas JOKS 'manifest' failas(net ir 'default').
[b]e[/b] - [i](Entry)[/i] nurodome, kad įeities tašką nurodysime komandinėje eilutėje, o ne imsime jį iš manifest failo, pvz.:
[code]jar cf[color=blue][b]e[/b][/color] programa.jar paketas_nr1.Main [color=blue][b]paketas_nr1\Main.class[/b][/color][/code]
[b]C[/b] - [i](Catalog)[/i] keisti direktorijas kompliavimo metu, pvz.
[code]jar cf ImageAudio.jar -C images . -C audio .[/code]
Su paveiksliukų galūnėmis failus failus imsime iš direktorijos 'images', o su muzikinių failų galūnėmis, iš direktorijos 'aubio'


[u][b]4.[/b] Paleidžiame mūsų sukompiliuota java jar failą.[/u]
[code]java -jar "C:\mano_java_programos\transportas.jar"[/code]

-----------------------
Viskas :).
Jeigu turime klausimų, klauskite forume - pasistengsiu į juos atsakyti.
* n00b'ai pirmiausiai turėtų viską suprasti iš pirmojo straipsnio, o tik tada jau gilintis į šį.

[b][color=green][i]Straipsnį parengė @ozzWANTED
Copyright 2009 © PhpFusion-Lt.com @ozzWANTED[/i][/color][/b]