úterý 17. července 2012

Maven - Která dependence má přednost?

Příspěvek se týká buildovacího nástroje Maven

Otázka:

Představte si, že máte větší strom závislostí, kde se projekty odkazují na další projekty a ty na další...
Pokud se v takovém stromě stane, že máme závislost (dependency) na stejný artefact (stejné groupId i artefactId) a liší se pouze verze artefaktu.
Která závislost se použije?


Odpověd:

Jaká verze knihovny se použije se určí podle těchto pravidel:
  1. Když jsou knihovny na stejné úrovni, vyhodnotí se jako vítězná ta co je jako první v pom.xml
  2. Pokud jsou knihovny na různých úrovních v závislostech, vyhraje ta s nejnižším stupněm zanoření v grafu
    1. eg. if dependencies for A, B, and C are defined as A -> B -> C -> D 2.0 and A -> E -> D 1.0, then D 1.0 will be used when building A because the path from A to D through E is shorter. You could explicitly add a dependency to D 2.0 in A to force the use of D 2.0


Řečeno jinak použije se ta knihovna, která se při prohledávání grafu závislostí do šířky najde jako první.


Zcela nedůležitá poznámka:

Mě osobně to trochu překvapilo, protože jsem spíš očekával, že se použije ta knihovna, která se najde jako první při prohledávání do hloubky (a ne do šířky).
Pokud někdo víte proč to funguje takhle zvláštně do šířky a ne do hloubky, tak mi to prosím vysvětlete.

Začínám být z toho Mavenu pěkně otrávený, proč musím build projektu programovat v nějakých hloupých XML souborech. Jak to mám debugovat? Proč se musím učit syntaxy pom.xml a pak složitě zjišťovat co to vlastně udělá. Jak krásné by bylo napsat to v Jave a v případě problému si to pustit v Debugu. Chvilemi se mi chce psát si vlastní build nastroj. Ach jo... :)

4 komentáře:

  1. Kdysi jsem se snažil hledat alternativy, ale žádnou použitelnou jsem nenašel. Gradle mě přišel nejlepší, ale debugovat to nešlo a jediná výhoda se mi zdála, že je to stručnější, což je fakt málo. Nicméně možná, že se pletu, protože jsem Gradlu dal jen málo času. Zatím nejsem přesvědčený, že Gradle je to co hledám, nicméně budu rád, když mě někdo přesvědčí.

    OdpovědětVymazat
  2. Já to teda bohužel nebudu, protože jsem si s ním nikdy nehrál. Ale když už si chceš psát vlastní build nástroj, tak jsem chtěl upozornit na existenci alternativ :)

    OdpovědětVymazat
  3. Časem jsem výrazně přehodnotil přístup ke Gradlu. Je super. Všichni ho používejte. Gradle Rocks

    OdpovědětVymazat