IVY e la gestione delle librerie

Programmazione - Eclipse Visite: 5881
document_eclipse IVY e la gestione delle librerie del proprio programma
Come gestire al meglio le librerie del proprio programma java? Per fare questo c'è IVY.
IVY serve a gestire le librerie del proprio progetto in maniera da scaricarle in automatico da alcuni repository comuni senza avere la necessità di averle in locale o di conservarle assieme al progetto ad esempio sul proprio CVS (o SVN che sia).
Supponiamo di avere un progetto Java sotto Eclipse.
Supponiamo che questo progetto sia di typo WEB Dinamico e che faccia uso di una serie di librerie.

Nella root del progetto bisogna creare il file ivy.xml così fatto:

<ivy-module version="2.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd">
<info organisation="NOME_ORGANIZZAZIONE" module="NOME_MODULO_ECLIPSE"/>
<configurations defaultconfmapping="default">
<conf name="default" />
</configurations>
<dependencies defaultconf="default">
<dependency org="javax.activation" name="activation" rev="1.1" />
</dependencies>
</ivy-module>


Dove per ogni libreria del progetto bisogna mettere una linea come la seguente:
<dependency org="javax.activation" name="activation" rev="1.1" />

Assieme al file ivy.xml ci vuole il file di setting di IVY, ivysettings.xml così fatto:

<ivysettings>
<caches checkUpToDate="false">
<cache name="mycache" basedir="${ivy.default.ivy.user.dir}/cache" />
</caches>
<settings defaultResolver="local" />
<resolvers>
<chain name="local" returnFirst="true">
<filesystem name="fornitori">
<artifact pattern="${ivy.lib.dir}/[artifact](-[revision]).[type]"/>
<artifact pattern="${ivy.lib.dir}/[artifact](-[revision]).[ext]"/>
</filesystem>
<url name="MIO_DOMINIO" m2compatible="true">
<artifact pattern="http://maven2.MIO_DOMINIO.it/[organisation]/[module]/[revision]/[artifact]-[revision](-[classifier]).[ext]"/>
</url>
<url name="mirror1" m2compatible="true">
<artifact pattern="http://mirrors.dotsrc.org/maven2/[organisation]/[module]/[revision]/[artifact]-[revision](-[classifier]).[ext]"/>
</url>
<url name="mirror2" m2compatible="true">
<artifact pattern="http://ftp.cica.es/mirrors/maven2/[organisation]/[module]/[revision]/[artifact]-[revision](-[classifier]).[ext]"/>
</url>
<url name="mirror3" m2compatible="true">
<artifact pattern="http://repository.jboss.com/maven2/[organisation]/[module]/[revision]/[artifact]-[revision](-[classifier]).[ext]"/>
</url>
<url name="repo1" m2compatible="true">
<artifact pattern="http://repo1.maven.org/maven2/[organisation]/[module]/[revision]/[artifact]-[revision](-[classifier]).[ext]"/>
</url>
<url name="ibiblio_maven2" m2compatible="true">
<artifact pattern="http://www.ibiblio.org/maven2/[organisation]/[module]/[revision]/[artifact](-[revision]).[ext]"/>
</url>
<url name="ibiblio_mirror" m2compatible="true">
<artifact pattern="http://mirrors.ibiblio.org/pub/mirrors/maven2/[organisation]/[module]/[revision]/[artifact](-[revision]).[ext]"/>
</url>
<ibiblio name="ibiblio"/>
</chain>
</resolvers>
</ivysettings>


Con questa istruzione
<settings defaultResolver="local" />
si indica che si vuole risolvere i domini prima in locale e poi si dovranno utilizzare gli altri repository elencati.

Con questa istruzione
<url name="MIO_DOMINIO" m2compatible="true">
<artifact pattern="http://maven2.MIO_DOMINIO.it/[organisation]/[module]/[revision]/[artifact]-[revision](-[classifier]).[ext]"/>
</url>

si indica un proprio dominio di maven con le proprie librerie.
In questa maniera si può mettere su un proprio repository MAVEN.

Poi bisogna modificare il file build.xml del progetto per inserire un opportuno TAG per il recupero delle librerie tramite ivy:
<project name="NOME_MODULO_ECLIPSE" default="target.dist" basedir="." xmlns:ivy="antlib:org.apache.ivy.ant">
<!-- // Ivy related targets -->
<target name="retrieveByIvy" description="Retrieves the libraries if needed by IVY.">
<ivy:settings file="${basedir}/ivysettings.xml"/>
<condition property="ivy.conf.name" value="default">
<not>
<isset property="ivy.conf.name"/>
</not>
</condition>
<echo message="Ivy conf name: ${ivy.conf.name}"/>
<ivy:resolve file="${basedir}/ivy.xml" conf="${ivy.conf.name}"/>
<ivy:retrieve conf="${ivy.conf.name}"
pattern="${lib.dir}/[artifact](-[revision]).[ext]"/>
</target>


Il TAG da inserire è questo:
<target name="retrieveByIvy" description="Retrieves the libraries if needed by IVY.">

Nel TAG project bisogna inserire questo
xmlns:ivy="antlib:org.apache.ivy.ant"

Se ci sono librerie che devono essere caricate dal locale bisogna avere un MAVEN installato come repository. Ovviamente!

Supponiamo di essere sul nostro server MAVEN.
Come vengono organizzate le librerie?
Se abbiamo
<dependency org="javax.activation" name="activation" rev="1.1" />

Sul server ci saranno le cartelle javax\activation per l'attributo org; poi ci sarà la cartella activation per l'attributo name; poi
ci sarà la cartella 1.1 per l'attributo rev e dentro ci sarà la libreria activation-1.1.jar.

RIFERIMENTI
A questo indirizzo (cliccate qui) trovate un utilissimo sito web che vi aiuta nello scovare i repository online per le vostre librerie. E' sufficiente ricercare la libreria per nome e il sito vi dirà le versioni e i repository disponibili.