web-dev-qa-db-fra.com

Existe-t-il un moyen de faire que Maven télécharge automatiquement les versions de capture instantanée?

J'ai donc un projet qui dépend d'une version instantanée d'un autre projet. La dépendance est:

<dependency>
  <groupId>org.oop</groupId>
  <artifactId>oop</artifactId>
  <version>0.9.9-SNAPSHOT</version>
</dependency>

Pour le projet oop, j'ai effectué un «déploiement en clair», de sorte que la version de l'instantané devrait se trouver quelque part dans le référentiel central maven. Mais quand je fais une nouvelle installation mvn, la dépendance de snapshot ci-dessus ne peut pas être résolue et j'obtiens ceci:

Manquant:

1) org.oop: oop: jar: 0.9.9-SNAPSHOT

Essayez de télécharger le fichier manuellement à partir du site Web du projet.

Ensuite, installez-le à l'aide de la commande suivante: mvn install: install-file -DgroupId = org.oop -DartifactId = oop -Dversion = 0.9.9-SNAPSHOT -Dpackaging = jar -Dfile =/chemin/vers/fichier

Alternativement, si vous hébergez votre propre référentiel, vous pouvez déployer le fichier à cet emplacement: mvn deploy: deploy-file -DgroupId = org.oop -DartifactId = oop -Dversion = 0.9.9-SNAPSHOT -Dpackaging = jar -Dfile =/chemin/to/file -Durl = [url] -DrepositoryId = [id]

Est-il possible de faire en sorte que Maven télécharge automatiquement l'instantané? Je dois manquer quelque chose ici.

EDIT1: Sur mon settings.xml j'ai:

   <server>
      <id>sonatype-nexus-snapshots</id>
      <username>XXXXXX</username>
      <password>XXXXXX</password>
    </server>

    <server>
      <id>sonatype-nexus-staging</id>
      <username>XXXXXX</username>
      <password>XXXXXX</password>
    </server>

EDIT2: enter image description here

16
chrisapotek

Ajoutez simplement ceci à votre ~/.m2/settings.xml:

<profiles>
  <profile>
     <id>allow-snapshots</id>
        <activation><activeByDefault>true</activeByDefault></activation>
     <repositories>
       <repository>
         <id>snapshots-repo</id>
         <url>https://oss.sonatype.org/content/repositories/snapshots</url>
         <releases><enabled>false</enabled></releases>
         <snapshots><enabled>true</enabled></snapshots>
       </repository>
     </repositories>
   </profile>
</profiles>
19
JohnPristine

Maven essaierait de télécharger automatiquement l'instantané et c'est effectivement le cas (comme votre erreur l'indique). Par défaut, Maven recherchera les nouvelles versions d’instantanés une fois par jour, mais vous pouvez modifier cet intervalle dans la configuration de votre référentiel d’instantanés (par exemple, dans settings.xml):

<updatePolicy>interval:5</updatePolicy>

Cela fera vérifier Maven toutes les 5 minutes (si vous construisez souvent). Vous pouvez également utiliser l'option -U ou --update-snapshots pour forcer la vérification manuellement.

Cependant, il ne peut pas trouver la dépendance. Pourriez-vous publier vos paramètres de référentiel et votre configuration d'artefact pour la dépendance de capture instantanée?

Est-ce que l'artefact org.oop:oop:jar:0.9.9-SNAPSHOT est dans votre référentiel? 

... donc la version de l'instantané doit se trouver quelque part dans le référentiel central maven.

Non ce n'est pas. J'ai essayé de le chercher, mais je ne l'ai pas trouvé. Après tout, il existe un mécanisme de mise en scène, alors peut-être que vos paramètres sont faux. Mais normalement, comme d’autres l'ont déjà dit, vous utiliseriez votre propre gestionnaire de référentiel, comme Artifactory ou Nexus.

19
Thomas

Pour mettre à jour des instantanés, essayez avec l'option -U.

-U,--update-snapshots                  Forces a check for updated
                                       releases and snapshots on remote
                                       repositories

Cependant, vous avez dit:

J'ai fait un 'déploiement propre mvn', donc la version de l'instantané devrait se trouver quelque part dans le référentiel central maven.

Ce n'est tout simplement pas possible, votre cliché s'en va ailleurs. Si je fais un mvn clean deploy sans configurer mon référentiel personnel, je reçois:

Échec du déploiement: l'élément de référentiel n'a pas été spécifié dans l'élément POM de distributionManagement ni dans le paramètre -DaltDeploymentRepository = id :: layout :: url.

Pour activer le déploiement, certaines configurations doivent être ajoutées à pom.xml, comme par exemple:

<distributionManagement>

    <!-- Publish versioned releases here -->
    <repository>
        <id>myrepo</id>
        <name>My releases</name>
        <url>http://nexus.mycompany.com/nexus/content/repositories/releases</url>
    </repository>

    <!-- Publish snapshots here -->
    <snapshotRepository>
        <id>myrepo</id>
        <name>my snapshots</name>
        <url>http://nexus.mycompany.com/nexus/content/repositories/snapshots</url>
    </snapshotRepository>

</distributionManagement>

<repositories>
    <repository>
        <id>myrepo</id>
        <name>My Public Repository</name>
        <url>http://nexus.mycompany.com/nexus/content/groups/public</url>
        <releases>
            <enabled>true</enabled>
        </releases>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </repository>
</repositories>
17
stivlo

Cette dépendance existe-t-elle dans votre référentiel? (dans pom.xml ou settings.xml)?

On dirait que non. En passant, jetez un coup d’œil à votre configuration, mais vous n’utilisez pas -o (hors ligne). Vous pouvez également utiliser -U pour actualiser les instantanés.

1
ssedano

Clarifions un peu la terminologie pour éviter tout malentendu.

"Maven Central" ( http://search.maven.org/ ) est un site mondial où vous ne trouvez que des versions. Central n'accepte pas les instantanés, le déploiement doit donc vous donner une erreur.

Vous voulez probablement parler de votre proxy/cache maven local/de votre entreprise. Ceux-ci peuvent également être configurés pour rejeter les versions d'instantané. Dans le cas de Nexus, vous pouvez également définir des règles plus complexes. Dans mon cas, j'ai eu un problème là-bas qui n'a donné aucune erreur pendant mvn deploy mais j'ai pu voir une erreur dans les journaux du serveur.

Essayez de suivre les données: Activez le débogage (mvn -X) pour voir où Maven télécharge les données. Ensuite, vérifiez sur le serveur pour voir si les artefacts ont été réellement téléchargés. Vérifiez les journaux du serveur pour les erreurs.

Notez également que les dépendances d'instantané ne sont actualisées qu'une fois par jour. donc ça ne marchera pas:

PC n ° 1: mvn install -> Erreur de dépendance manquante PC n ° 2: mvn deploy PC n ° 1: mvn install -> La dépendance est toujours manquante en raison de la règle "mettre à jour une fois par jour"

Essayez mvn install -U pour forcer Maven à actualiser ses métadonnées en cache.

0
Aaron Digulla

J'aborde le problème des instantanés non mis à jour même lorsque l'option -U est définie sur la ligne de commande. Pour moi, le problème était que mon client était Maven 3 et le serveur, Maven 2, et dans Maven 3, les instantanés uniques ne sont plus pris en charge. Nous avons dû créer un nouveau référentiel avec des instantanés horodatés pour prendre en charge les clients 3.xx.

0
Ags1

Tu peux soit

  • utilisez un projet parent qui construit tous vos instantanés, ou
  • déployez vos instantanés sur votre serveur maven build (nexus/archiva/..), par exemple, mvn: deploy
0
Johan Sjöberg