Někdy mi přijde, že programátoři postrádají elementární znalosti, případně zdravý selský rozum. Dneska snad nikdo nepřibaluje do waru Servlet API, nebo alespoň čtenáři tohoto blogu ne. Nicméně i tak na vás může vybafnou war o velikosti 80 MB. Na locale si toho možná ani nevšimnete, i když ani virtuální mašiny nemají nekonečné disky. Ovšem dostat takový build k zákazníkovi do Afriky, kde je dokonce problém po tamější síti stáhnout e-mail, vás zbytečně obírá o čas. Takže proč je war vůbec tak velký a co s tím dělat?

Nejprve jsme tedy zkontrolovali triviality jako Servlet API a co teď? Co tam třeba dělá Hibernate, když vyvíjíte pro aplikační server (například JBoss)? Klidně si ho dejte do test scope, ale proč ho přibalujete? Tímto způsobem můžete projít celou Java EE specifikaci.

Zbytečnosti

Pak bych si prošel zbytek knihoven a zamyslel se, proč je vůbec potřebuji. Koukám třeba na vaadin závislosti a vidím vaadin-client-7.x.x.jar, zhruba 16MB, a sakra. Mrknu do dokumentace: „Neměli byste nasazovat.“.

JBoss/Wildfly

JBoss má kopec implicitních modulů, které sám zapíná podle určitých podmínek. Například Resteasy, pokud objeví JAX-RS anotace.

Pak tu jsou často používané knihovny jako httpclient, který má skoro megabyte a v JBossu stejně je. Ten je ale potřeba ručně zapnout. Buď globálně ve standalone.xml, respektive v domain.xml. Nebo přímo z waru. A to v dependencies definovaných v manifestu (zajistí maven-war-plugin) nebo v jboss-deployment-structure.xml. Že se tak svazujete s JBossem? Ano, ale při případném přechodu (třeba na Tomcat) jen změníte provided scope na compile, ne? Námitku, že nechcete sledovat, jaká verze JBossu má jaké verze knihoven, neberu, jelikož jsou dostupné BoM.

Pokud budete skuteční psychopati ohledně velikosti waru, tak si můžete vytvořit moduly pro velké knihovny třetích stran, nahrát je k zákazníkovi jednou, a distribuovat minimalistický war, který bude obsahovat jen váš kód.

Bezpečnostní pojistky

Tak jste si uklidili, gratuluji, ale ani code review nezaručí, že vám pořádek vydrží. Můžete si tam knihovny, kterých jste se už zbavili, opět neúmyslně zavést přes tranzitivní závislost. Pojistkou může být šikovně nastavený enforcer plugin. Jednak pro zakázání určitých závislostí, jednak i pro kontrolu velikosti výsledného waru. U kontroly velikosti pozor, protože výchozí bindování pluginu je na fázi validate, kdy war ještě ani zdaleka není hotový. Konkrétně tuto exekuci tudíž musíte navázat na fázi package.

Anketa

A jak velký je váš war? Nebo je vám to šumák?