Někdy mi přijde, že programátoři postrádají elemen­tární znalosti, případně zdravý selský rozum. Dneska snad nikdo nepři­ba­luje 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šim­nete, i když ani virtuální mašiny nemají nekonečné disky. Ovšem dostat takový build k zákaz­ní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 zkont­ro­lo­vali trivia­lity jako Servlet API a co teď? Co tam třeba dělá Hiber­nate, když vyvíjíte pro aplikační server (například JBoss)? Klidně si ho dejte do test scope, ale proč ho přiba­lu­jete? 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ře­buji. Koukám třeba na vaadin závis­losti a vidím vaadin-client-7.x.x.jar, zhruba 16MB, a sakra. Mrknu do dokumen­tace: „Neměli byste nasazovat.“.

JBoss/Wildfly

JBoss má kopec impli­cit­ní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, respek­tive v domain.xml. Nebo přímo z waru</a>. A to v depen­den­cies defino­vaných v manifestu (zajistí maven-war-p­lu­gin) nebo v jboss-deployment-structure.xml. Že se tak svazu­jete 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 sledo­vat, jaká verze JBossu má jaké verze kniho­ven, neberu, jelikož jsou dostupné BoM.

Pokud budete skuteční psycho­pati ohledně velikosti waru, tak si můžete vytvořit moduly pro velké knihovny třetích stran, nahrát je k zákaz­níkovi jednou, a distri­buovat minima­lis­tický war, který bude obsahovat jen váš kód.

Bezpečnostní pojistky

Tak jste si uklidili, gratu­luji, 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 tranzi­tivní závis­lost. Pojistkou může být šikovně nasta­vený enforcer plugin. Jednak pro zakázání určitých závislostí, jednak i pro kontrolu velikosti výsled­né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?