2010-05-01 3 views
4

J'ai utilisé Ivy un peu, mais il me semble avoir encore beaucoup à apprendre.Ivy résoudre ne fonctionne pas avec artefact dynamique

J'ai deux projets. L'un est une application web et l'autre est une bibliothèque dont dépend l'application web. La configuration est que le projet de bibliothèque est compilé dans un fichier jar et publié en utilisant Ivy dans un répertoire du projet. Dans le fichier de construction de l'application Web, j'ai une cible Ant qui appelle la tâche Ivy. Je voudrais faire en sorte que l'application web utilise le mode de résolution dynamique pendant le développement (sur les machines locales du développeur) et le mode de résolution par défaut pour les versions de test et de production. Auparavant, j'ajoutais un horodatage au fichier d'archive de la bibliothèque afin qu'Ivy remarque les modifications dans le fichier lorsque l'application Web tentait de résoudre sa dépendance à ce fichier. Dans Eclipse, cette procédure est fastidieuse car, dans l'application Web, le projet devait être actualisé et le chemin de génération modifié chaque fois qu'un nouveau fichier bibliothèque était publié. Publier un fichier jar nommé de la même manière à chaque fois, je suppose que seuls les développeurs ont besoin d'actualiser le projet.

Le problème est que l'application Web est incapable de récupérer le fichier JAR dynamique.

La sortie je me ressemble à ceci:

resolve: 
[ivy:configure] :: Ivy 2.1.0 - 20090925235825 :: http://ant.apache.org/ivy/ :: 
[ivy:configure] :: loading settings :: file = /Users/richard/workspace/webapp/web/WEB-INF/config/ivy/ivysettings.xml 
[ivy:resolve] :: resolving dependencies :: com.webapp#webapp;[email protected] 
[ivy:resolve] confs: [default] 
[ivy:resolve] found com.webapp#library;latest.integration in local 
[ivy:resolve] :: resolution report :: resolve 142ms :: artifacts dl 0ms 
--------------------------------------------------------------------- 
|     |   modules   || artifacts | 
|  conf  | number| search|dwnlded|evicted|| number|dwnlded| 
--------------------------------------------------------------------- 
|  default  | 1 | 0 | 0 | 0 || 0 | 0 | 
--------------------------------------------------------------------- 
[ivy:resolve] 
[ivy:resolve] :: problems summary :: 
[ivy:resolve] :::: WARNINGS 
[ivy:resolve]  :::::::::::::::::::::::::::::::::::::::::::::: 
[ivy:resolve]  ::   UNRESOLVED DEPENDENCIES   :: 
[ivy:resolve]  :::::::::::::::::::::::::::::::::::::::::::::: 
[ivy:resolve]  :: com.webapp#library;latest.integration: impossible to resolve dynamic revision 
[ivy:resolve]  :::::::::::::::::::::::::::::::::::::::::::::: 
[ivy:resolve] :::: ERRORS 
[ivy:resolve] impossible to resolve dynamic revision for com.webapp#library;latest.integration: check your configuration and make sure revision is part of your pattern 
[ivy:resolve] 
[ivy:resolve] :: USE VERBOSE OR DEBUG MESSAGE LEVEL FOR MORE DETAILS 

BUILD FAILED 
/Users/richard/workspace/webapp/build.xml:71: impossible to resolve dependencies: 
resolve failed - see output for details 

L'application web résolution cible ressemble à ceci:

<target name="resolve" depends="load-ivy"> 
    <ivy:configure file="${ivy.dir}/ivysettings.xml" /> 

    <ivy:resolve 
     file="${ivy.dir}/ivy.xml" 
     resolveMode="${ivy.resolve.mode}"/> 

    <ivy:retrieve pattern="${lib.dir}/[artifact]-[revision].[ext]" type="jar" sync="true" /> 
</target> 

Dans ce cas, ivy.resolve.mode a une valeur de ' dynamique »(sans les guillemets).

Le fichier Ivy de l'application Web est simple. Il ressemble à ceci:

<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="com.webapp" module="webapp"/> 

    <dependencies> 
     <dependency name="library" rev="${ivy.revision.default}" revConstraint="${ivy.revision.dynamic}" /> 
    </dependencies> 

</ivy-module> 

Au cours du développement, ivy.revision.dynamic a une valeur de 'latest.integration'. Pendant la production ou le test, 'ivy.revision.default' a la valeur '1.0'.

Des idées? S'il vous plaît laissez-moi savoir s'il y a plus d'informations que je dois fournir.

Merci!

Répondre

3

Je pense que vous devez supprimer l'utilisation de l'attribut revConstraint dans le fichier ivy de votre application web.

Ivy pense que « latest.revision » est la révision que vous souhaitez récupérer au lieu de réellement la recherche de la dernière révision, je vous recommande :-)

couchait la dépendance comme suit:

<dependency name="library" rev="latest.integration"/> 

Explication:

revConstraint est définie lorsque vous publiez un module. Il enregistre la dernière révision au moment de la publication. Donc vous n'en avez pas besoin pendant le développement. Vous n'avez pas non plus besoin d'utiliser une variable de révision. Lorsque vous publiez un module ivy avec les références de révision "latest.revision" ou "latest.release", le résultat est résolu et enregistré dans l'attribut revConstraint.

Voir le lien suivant pour plus d'informations:

http://ant.apache.org/ivy/history/latest-milestone/ivyfile/dependency.html#revision-constraint

+0

Merci, Mark, mais cela ne résout toujours pas mon problème. J'ai changé la dépendance comme vous l'avez indiqué, varié la valeur de resolveMode dans la cible de résolution de webapp entre 'default' et 'dynamic', et l'ai complètement supprimé, et toujours la dernière publication du pot de bibliothèque n'est pas 'ramassé' par webapp . Faire plus de recherche m'a conduit à ceci: http://ant.apache.org/ivy/history/latest-milestone/concept.html#change Cependant, l'utilisation de checkmodified sur le résolveur local ne fonctionne pas non plus. Je ne dois toujours pas comprendre quelque chose correctement. – richever

+0

J'ai également essayé d'ajouter changePattern en vain: Le fichier bibliothèque est nommé libra-dev.jar. – richever

+1

Pourriez-vous mettre à jour votre publication avec la nouvelle sortie ivy? Aussi pourriez-vous s'il vous plaît inclure votre fichier ivysettings (Si vous en utilisez un) –

4

j'ajouté ce qui suit et il semble fonctionner. Je vais mettre cela en garde avec la reconnaissance que je me bats aussi avec le lierre et beaucoup de choses que je travaille sont à peu près en boîte noire ... c'est-à-dire que ça fait le travail donc je m'arrête de jouer du violon! Ma compréhension est un peu moins avancée que j'ai peur de dire.

Anwyay, à settings.xml j'ajouté:

<modules> 
    <module organisation="my.organisation" name="*" resolveMode="dynamic"/> 
</modules> 

Ce que je pense dit lierre à utiliser son intelligence pour travailler avec ces modules. Cette intelligence inclut éventuellement la vérification des versions mises à jour du module au moment de la résolution.

De même, sur les résolveurs, j'ai ajouté checkModified et changingPattern. Apparnntly il est important de le faire à la fois sur le résolveur réelle et la chaîne d'emballage (si vous en avez un):

<chain name="foo" checkmodified="true" changingPattern=".*-SNAPSHOT"> 
    <url name="bar" checkmodified="true" changingPattern=".*-SNAPSHOT"> 
     <ivy pattern=... /> 
     <artifact pattern=... /> 
    </url> 
    ... 
</chain> 

Le checkModified ne l'espérons ce qu'il dit sur l'étain. Et je comprends que le changingPattern dit ivy pour vérifier si les artefacts contenant ce modèle ont une nouvelle mise à jour dans le repo. J'utilise personnellement un repo maven où les trucs modifiables ont toujours -SNAPSHOT ajouté à celui-ci, c'est pourquoi je l'utilise (assez commun je pense). Je suppose que vous pouvez remplacer ce changingPattern par ". *" Ou quelque chose qui vous convient mieux.

Questions connexes