Adresářová struktura projektů v Javě
Adresářovou strukturu projektů v Javě ovlivňují tři hlediska:
- uložení projektů ve správě verzí včetně podpory vývojových větví (branches) a značek (tags),
- struktura adresářů pro vlastní vývoj - adresáře pro zdrojové soubory, přeložené soubory, testy, konfigurační soubory atd.,
- stromová struktura zdrojových souborů v Javě, která je určena hierarchií balíčků (packages),
Tato problematika je mimo rozsah výuky v úvodním kursu programování.
|
1. Struktura úložiště
V úložišti správy verzí je obvykle uloženo více projektů. Pro každý projekt se doporučuje vytvořit:
- trunk (kmen) - zde probíhá hlavní vývoj
- tags (značky) - zde se umisťují značky, které odkazují na důležité milníky ve vývoji projektu (obvyklé je označování dle čísel verzí),
- branches (větve) - zde se provádí alternativní vývoj (např. vývoj varianty pro jiný operační systém, varianta pro jiného zákazníka, zkušební varianty). Má smysl u větších projektů.
Struktura úložiště by mohla vypadat následovně:
Struktura úložiště je závislá i na použitém systému na správu verzí, zde je popsáno doporučení pro Subversion (a zvyklosti v CVS). V dokumentaci k Subversion je následující příklad adresářové struktury:
/
calc/
trunk/
tags/
branches/
calendar/
trunk/
tags/
branches/
spreadsheet/
trunk/
tags/
branches/
...
2. Hierarchie balíčků
Stromová struktura balíčků musí v Javě odpovídat stromové struktuře adresářů, ve kterých jsou uloženy zdrojové soubory. Tj. pokud je třída Hra (tj. zdrojový soubor Hra.java) v balíčku logika (tj. na začátku zdrojového souboru je package logika;), tak soubor Hra.java musí být v adresáři, který se jmenuje logika.
Více úrovní balíčků (což je obvyklé) se v názvu odděluje tečkou, čemuž by měla odpovídat opět adresářová struktura. Např. pokud by byla třída Hra v balíčku cz.vse.adventura.logika, tak by soubor Hra.java měl být v adresáři cz/vse/adventura/logika (ve Windows se často používají obrácená lomítka).
Názvy balíčků by měly být malými písmeny (je to doporučení, není to překladačem vyžadováno), měly by obsahovat pouze písmena a číslice (lze i některé další znaky, doporučuji ale nepoužívat). Ve jmenných konvencích od firmy Sun se doporučuje, aby kořenový adresář projektu odpovídal zkratce země (např. cz či us) či lépe doménovému jménu organizace na webu v obráceném pořadí (např. cz.vse či org.junit). Ve zkušebních a výukových projektech se ale toto pravidlo obvykle neuplatňuje.
Následuje obrázek hierarchie balíčků a souborů (obrázek z Eclipse):
Např. třída Start.Java vypadá následovně (všimněte si uvedení balíčku na prvním řádku, nejsou uvedeny komentáře ke kódu):
package main;
import textoverozhrani.TextoveRozhrani;
public class Start {
public static void main(String[] args) {
TextoveRozhrani hra = new TextoveRozhrani();
hra.hraj();
}
}
Některá vývojová prostředí (NetBeans i Eclipse) umožňují roztrhnout soubory z jedné hierarchie balíčků do více adresářů (např. aby testy byly jinde, než vlastní zdrojové soubory, které se testují). Více v další části.
3. Adresáře projektu pro vývoj
3.1 Problematika adresářů pro vývoj
V počátcích programování v Javě se většinou nevytvářely samostatné adresáře pro jednotlivé části projektu (s výjimkou adresářové struktury pro projekty). V J2EE je stalo součástí projektů i velké množství dalších souborů (html, xml, konfigurační soubory, obrázky, ...) a začala se používat adresářová struktura, ve které byly zdrojové soubory v samostatném adresáři. Existuje více různých doporučení pro organizaci adresářů, typická struktura J2EE projektu vypadá následovně:
/ | project root directory (run all tools from here) |
build.xml | sestavovací soubor pro Ant |
lib/ | knihovny (jar soubory) potřebné pro sestavení aplikace |
src/ | zdrojové soubory v Javě |
web/ | Web soubory (html, jsp, atd.) |
conf/ | konfigurační soubory |
web-dev.xml | konfigurační soubor pro vývojový server |
web-live.xml | konfigurační soubory pro produkční server |
build/ | sem se překládají zdrojové soubory (*.class), kopírují konfigurační soubory (tento adresář může být smazán) |
webapp/ | root projektu při umístění na vývojový/produkční server |
WEB-INF/ | konfigurační soubory (conf/web.xml atd.) |
classes/ | kořenový adresář class souborů |
lib/ | knihovny (jar soubory) potřebné pro běh aplikace (obvykle podmnožina knihoven z /lib) |
test/ | adresář pro jednotkové testy (unit test) |
Principy této adresářové struktury se začaly používat i u ostatních typů aplikací. Většina vývojových prostředí tuto adresářovou strukturu podporuje (výjimkou je BlueJ), některé ji téměř vyžadují (NetBeans).
Největší problém je v oddělení testů od zdrojových souborů do samostatných adresářů.
3.2 Adresáře projektů v BlueJ
Prostředí BlueJ je určeno pro malé projekty a příliš nepodporuje rozdělení projektu do různých adresářů.
Soubory .class se v BlueJ překládají do adresáře, ve kterém je zdrojový soubor - nelze soubory *.class umístit do jiného adresáře.
Také jednotkové (JUnit) testy musí být ve stejném adresáři, ve kterém je třída, která se testuje.
BlueJ si používá zvláštní adresář pro vygenerovanou dokumentace - tu umísťuje do podadresáře doc.
Pokud v projektu v BlueJ chcete použít externí knihovny (soubor .jar), tak je vhodné je umístit do podadresáře +libs projektu (součástí názvu adresáře je i plus). Při otevření projektu se tyto knihovny umístí na classpath.
3.3 Adresáře projektů v NetBeans
TODO: dopsat popis
Obrázek projektu se zdrojovými soubory a testy v NetBeans (příklad s adventurou z kursu 4it115):
Obrázek přiřazení adresářů se zdrojovými soubory a s testy v NetBeans:
Následující obrázek ukazuje adresářovou strukturu projektu v NetBeans. Při vytváření projektu (Checkou ze Subversion) jsem umístil adresář s projektem mimo stažený obsah z úložiště. Červenými šipkami jsou zvýrazněny hlavní adresáře (adresář projektu, adresář ze zdrojovými soubory a adresář s testy) - u kořenových adresářů není zobrazeno vlastní jméno adresáře na disku, jména těchto adresářů jsou vidět na předchozím obrázku). Všimněte si, že v adresáři projektu je podadresář build, ve kterém jsou dva podadresáře. Podadresář class obsahuje hierarchii balíčků a soubory .class odpovídající souborům .java ve zdrojovém adresáři, podadresář test obsahuje hierarchii balíčků a soubory .class odpovídající testům.
3.4 Adresáře projektů v Eclipse
TODO: dopsat popis
Následující obrázek ukazuje adresářovou strukturu projektu v Eclipse, kdy jsou odděleny zdrojové adresáře (src a test) od adresáře pro vývoj. Červenými šipkami jsou zvýrazněny adresáře hlavní adresáře. Všimněte si, že i když jsou odděleny zdrojové adresáře, tak adresář pro sestavení (bin) obsahuje soubory .class od obou zdrojových adresářů.
3.5 Sdílení projektu mezi více prostředími
Je problematické sdílet projekt mezi BlueJ a NetBeans, neboť NetBeans standardně vyžadují umístění testů do samostatného adresáře. Lze to řešit následujícími způsoby (oboje na straně NetBeans):
- v NetBeans nespouštět testy pomocí integrované podpory, ale vytvořit si vlastní třídu na spouštění testů,
- vytvořit si pro NetBeans vlastní sestavovací skript, který zohlední umístění testů do stejného adresáře se zdrojovými soubory (takto to dělá upravená varianta NetBeans pro podporu projektů v BlueJ).
TODO: dopsat sdílení projektů mezi NetBeans a Eclipse, popř. mezi BlueJ a Eclipse.
4. Odkazy