{"id":971,"date":"2008-12-03T11:41:50","date_gmt":"2008-12-03T09:41:50","guid":{"rendered":"http:\/\/webbservern.se\/~jonas\/wordpress\/?p=971"},"modified":"2008-12-03T11:41:50","modified_gmt":"2008-12-03T09:41:50","slug":"att-hantera-beroenden-i-maven-2","status":"publish","type":"post","link":"https:\/\/webbservern.se\/~jonas\/wordpress\/?p=971","title":{"rendered":"Att hantera beroenden i Maven 2"},"content":{"rendered":"<p>Maven \u00e4r bra p\u00e5 m\u00e5nga s\u00e4tt och vis. Det underl\u00e4ttar verkligen byggprocessen och beroenden mellan olika komponenter hanteras t\u00e4mligen v\u00e4l. Det \u00e4r \u00e4nd\u00e5 inte ovanligt att man beh\u00f6ver hj\u00e4lpa Maven lite p\u00e5 traven om man har m\u00e5nga sn\u00e5riga beroenden och det \u00e4r \u00e4mnet f\u00f6r dagens inl\u00e4gg.<\/p>\n<p>Om ditt projekt har ett beroende till tredjepartskomponenten VeryGoodLibraryA-1.0 som beror p\u00e5 StandardComponent-2.1 kommer Maven att hantera detta transitiva beroende (fr\u00e5n version 2.0) och ladda ner (om det beh\u00f6vs) och tillhandah\u00e5lla s\u00e5v\u00e4l VeryGoodLibraryA-1.0 som StandardComponent-2.1. Men vad h\u00e4nder om du \u00e4ven beror p\u00e5 VeryGoodLibraryB-1.0 som i sin tur beror p\u00e5 StandardComponent-2.5?<\/p>\n<p>Folk som \u00e4r inne i OSGi-sv\u00e4ngen kanske rycker p\u00e5 axlarna undrar vad som \u00e4r problemet. Men s\u00e5 roligt ska vi inte ha eftersom vi nu antar att s\u00e5v\u00e4l VeryGoodLibraryA-1.0 som VeryGoodLibraryB-1.0 klarar sig bra med StandardComponent-2.5 som r\u00e5kar vara bak\u00e5tkompatibel med StandardComponent-2.1.<\/p>\n<p>Hur reder vi ut detta? Till att b\u00f6rja med kanske man inte vet att det \u00e4r VeryGoodLibraryA och VeryGoodLibraryB som har olika \u00e5sikter om vad som \u00e4r l\u00e4mplig version p\u00e5 StandardComponent. Lyckligtvis \u00e4r det en av de saker som Maven-pluginet <a href=\"http:\/\/maven.apache.org\/plugins\/maven-dependency-plugin\/\">Maven Dependency Plugin<\/a> kan hj\u00e4lpa oss med.<\/p>\n<p>F\u00f6r att se vilka beroenden som huserar i v\u00e5rt projekt k\u00f6r vi f\u00f6ljande harang:<br \/>\n<code>mvn dependency:resolve<\/code><\/p>\n<p>I den rapport som spottas ut ser vi egentligen bara problemet, Maven har favoriserat fel version av StandardComponent (2.1 ist\u00e4llet f\u00f6r 2.5).<\/p>\n<p>F\u00f6r att bli lite klokare p\u00e5 vem som har bereonden till vem pr\u00f6var vi tr\u00e4d-vyn:<br \/>\n<code>mvn dependency:tree<\/code><\/p>\n<p>Med samma enkla exempel som ovan skulle svaret kunna se ut ungef\u00e4r s\u00e5 h\u00e4r:<br \/>\n<code><br \/>\n[INFO] +- org.verygoodlibrary:A:jar:1.0:compile<br \/>\n[INFO] |  +- org.standardcomponent:standard-component:jar:2.1:compile<br \/>\n[INFO] +- org.verygoodlibrary.B:jar:1.0:compile<br \/>\n[INFO] |  - org.standardcomponent:standard-component:jar:2.5:compile<br \/>\n<\/code><\/p>\n<p>Nu b\u00f6r vi ha f\u00e5tt lite b\u00e4ttre kl\u00e4m p\u00e5 problemet och vet hur vi skulle vilja ha det. Det finns, som vanligt, flera s\u00e4tt att l\u00f6sa problemet och innan man g\u00f6r n\u00e5got f\u00f6rhastat kan det vara klokt att l\u00e4sa <a href=\"http:\/\/maven.apache.org\/guides\/introduction\/introduction-to-dependency-mechanism.html\">en introduktion till beroende-hanteringen i Maven<\/a>.<\/p>\n<p>I introduktionen ovan kan man l\u00e4sa att Maven favoriserar det beroende som \u00e4r n\u00e4rmast till ditt projekt i beroendetr\u00e4det. Om beroendena \u00e4r p\u00e5 samma niv\u00e5 avg\u00f6r (sedan Maven 2.0.5) deklarationsordningen.<\/p>\n<p>Ett s\u00e4tt att l\u00f6sa det f\u00f6renklade exemplet ovan skulle kunna vara att byta plats p\u00e5 beroendena (dependency-elementen f\u00f6r VeryGoodLibraryA och VeryGoodLibraryB) i pom.xml:en.<\/p>\n<p>Ett annat s\u00e4tt att l\u00f6sa ut knuten skulle kunna vara att s\u00e4ga \u00e5t Maven att ignorera VeryGoodLibraryA:s beroende p\u00e5 StandardComponent-2.1. D\u00e5 kommer VeryGoodLibraryB:s beroende p\u00e5 StandardComponent-2.5 att kunna l\u00f6sas ut och allt blir bra. Detta kan g\u00f6ras med exclusion-element p\u00e5 VeryGoodLibraryA:s dependency-element i ditt projekts pom.<br \/>\n<code><br \/>\n&nbsp;&lt;dependency&gt;<br \/>\n&nbsp;&nbsp;&lt;groupid&gt;org.verygoodlibrary&lt;\/groupid&gt;<br \/>\n&nbsp;&nbsp;&lt;artifactid&gt;A&lt;\/artifactid&gt;<br \/>\n&nbsp;&nbsp;&lt;version&gt;1.0&lt;\/version&gt;<br \/>\n&nbsp;&nbsp;&lt;exclusions&gt;<br \/>\n&nbsp;&nbsp;&nbsp;&lt;exclusion&gt;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;artifactid&gt;standard-component&lt;\/artifactid&gt;<br \/>\n&nbsp;&nbsp;&nbsp;&lt;\/exclusion&gt;<br \/>\n&nbsp;&nbsp;&lt;\/exclusions&gt;<br \/>\n&nbsp;&lt;\/dependency&gt;<br \/>\n<\/code><\/p>\n<p>I mitt konkreta verkliga fall best\u00e5r mitt projekt av en hel hierarki med egna projekt. D\u00e4r tyckte jag det blev enklast att speca lite versioner p\u00e5 toppniv\u00e5n (den &#8220;\u00f6versta&#8221; pom.xml:en).<\/p>\n<p>Har ni egna erfarenheter av Mavens beroendehantering eller byggverktyg i allm\u00e4nhet? Eller b\u00e4ttre l\u00f6sningar p\u00e5 ovanst\u00e5ende problem? Kommentera g\u00e4rna isf.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Maven \u00e4r bra p\u00e5 m\u00e5nga s\u00e4tt och vis. Det underl\u00e4ttar verkligen byggprocessen och beroenden mellan olika komponenter hanteras t\u00e4mligen v\u00e4l. Det \u00e4r \u00e4nd\u00e5 inte ovanligt att man beh\u00f6ver hj\u00e4lpa Maven lite p\u00e5 traven om man har m\u00e5nga sn\u00e5riga beroenden och &hellip; <a href=\"https:\/\/webbservern.se\/~jonas\/wordpress\/?p=971\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3,6,39,26],"tags":[793,370],"class_list":["post-971","post","type-post","status-publish","format-standard","hentry","category-arbete","category-datorer","category-java","category-programmering","tag-java","tag-maven"],"_links":{"self":[{"href":"https:\/\/webbservern.se\/~jonas\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/971","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/webbservern.se\/~jonas\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/webbservern.se\/~jonas\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/webbservern.se\/~jonas\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/webbservern.se\/~jonas\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=971"}],"version-history":[{"count":0,"href":"https:\/\/webbservern.se\/~jonas\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/971\/revisions"}],"wp:attachment":[{"href":"https:\/\/webbservern.se\/~jonas\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=971"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/webbservern.se\/~jonas\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=971"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/webbservern.se\/~jonas\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=971"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}