Maven installer et déployer des dépendances 3ème partie avec la ligne de commande simple

StackOverflow https://stackoverflow.com/questions/4632648

  •  08-10-2019
  •  | 
  •  

Question

Nous avons un certain nombre de dépendances de tiers qui ne sont pas hébergés partout. Pour chacun d'eux, nous avons un fichier jar que nous aimerions être en mesure d'installer et / ou déployons à notre référentiel. Certains des fichiers jar ont leurs propres dépendances et nous devons également déclarer ces derniers.

Nous avons fait des fichiers pom.xml pour chaque fichier jar déclarer les groupId, artifactId, dépendances, etc. Ces fichiers pom.xml ont tous un pom-mère commune qui déclare une partie de l'information commune (par exemple <repositories> et <distributionManagement>) .

Je voudrais être en mesure d'installer ou de déployer ces dépendances avec quelque chose d'aussi simple que mvn install et mvn deploy (ou peut-être mvn install:install-file et mvn deploy:deploy-file) et ont toutes les propriétés nécessaires pour ces commandes (artifactId, repositoryId, etc.), soit lu à partir des fichiers pom.xml.

Pour que cela fonctionne, au moins pour le déploiement, j'ai essayé de mettre ce qui suit dans mon pom parent:

<build>
  <plugins>
    <plugin>
      <artifactId>maven-deploy-plugin</artifactId>
      <version>2.4</version>
      <configuration>
        <file>${jarfile}</file>
        <pomFile>pom.xml</pomFile>
        <repositoryId>our-id</repositoryId>
        <url>our-url</url>
      </configuration>
    </plugin>
  </plugins>
</build>

et ayant chacun des enfants poms définir la propriété jarfile. Cela me permet de lancer mvn deploy:deploy-file de déployer tous les artefacts pom enfants. On peut supposer que je pouvais faire quelque chose de similaire pour obtenir mvn install:install-file au travail.

Mais avec cette approche, je suis incapable de libérer la pom-mère (que je dois faire puisque l'enfant poms en dépendent), et si je tente de mvn release:perform sur la pom-mère, je reçois des erreurs telles que:

Cannot override read-only parameter: pomFile

Je sens que je vais probablement sur ce dans le mauvais sens. Tout ce que je veux vraiment faire est la suivante:

  • Placez le code commun pour tous les bocaux de tiers dans un pom parent partagé
  • Ecrire un minimum pom supplémentaire pour chaque pot tiers
  • être en mesure d'exécuter quelque chose comme mvn install ou mvn deploy sans avoir à spécifier toutes les propriétés de ligne de commande compliquées

Comment puis-je mieux accomplir cela?

Edit:. Fait plus clair au-dessus qu'idéalement je voudrais être en mesure d'exécuter quelque chose d'aussi simple que mvn install ou mvn deploy et ne pas avoir à spécifier des propriétés sur la ligne de commande

Était-ce utile?

La solution 2

Ok, je l'ai trouvé une solution qui me permet seulement de lancer mvn install ou mvn deploy et ont le fichier jar installé dans le répertoire local ou distant. Inspiré par un poste à la liste maven-utilisateurs et en utilisant le build-assistant plug-in , dans la pom-mère, je:

<pluginManagement>
    <plugins>
        <!-- Attach the jar file to the artifact -->
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>build-helper-maven-plugin</artifactId>
            <version>1.5</version>
            <executions>
                <execution>
                    <id>attach-artifacts</id>
                    <phase>package</phase>
                    <goals>
                        <goal>attach-artifact</goal>
                    </goals>
                    <configuration>
                        <artifacts>
                            <artifact>
                                <file>${artifactId}-${version}.jar</file>
                                <type>jar</type>
                            </artifact>
                        </artifacts>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</pluginManagement>

Et puis dans les poms enfants, j'ai:

<packaging>pom</packaging>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
...
<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>build-helper-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

Certains des morceaux de ce qui m'a d'abord trébuché:

  • L'exécution de attach-artifact devrait être sous <pluginManagement> afin qu'il ne soit pas exécutée si vous mvn install ou mvn deploy la pom-mère.
  • Les enfants doivent spécifier le build-helper-maven-plugin sous les plugins construire afin que le code de la <pluginManagement> mère s'exécuter.
  • Les enfants doivent être déclarés comme ayant <packaging>pom</packaging> parce que vous ne pouvez pas ajouter un pot à un artefact si elle a le même nom que l'artefact.

Le seul inconvénient que je vois à cette approche est que l'artefact se déploie en tant que type pom au lieu du type jar. Mais je ne l'ai pas vu de réelles conséquences de cela.

Autres conseils

Lorsque Maven manque une dépendance, il vous donnera une erreur dans la sortie de ce qui contient la ligne de commande à utiliser pour ajouter le pot à un dépôt distant. Cette ligne de commande crée automatiquement un POM pour vous et télécharger les deux ensemble. Est-ce que ne suffit pas à vos besoins?

L'utilisation de cette installation, si je sais que j'ai une dépendance sans représentation à distance référentiel, je habituellement juste aller de l'avant et de définir dans ma construction avec le GAV que je veux, exécutez la construction une fois, regardez alors les erreurs de construction . Copiez la commande pour le déploiement, puis exécutez cette commande. Vous voulez vous assurer que vous avez les éléments <repository> mis en place correctement dans le POM parent ainsi également mis en place des éléments de <server> correspondant dans votre settings.xml avec le mot de passe de téléchargement référentiel. En dehors de cela, vous devriez être bon d'aller.

Je voudrais ajouter que vous devriez vérifier Nexus avant d'arriver trop loin. Il vaut la peine de les tracas de mettre en place maintenant! : -)

Je rencontre ce problème dans mon travail:

  

Maintenant, j'ai un target.jar (il a une liste de dépendances: a.jar, b.jar, c.jar ...), je veux utiliser mvn install:install-file pour le mettre dans mon repo local, mais quand je lance le soufflage de commande

mvn install:install-file -Dfile=/Users/username/.../target.jar -DgroupId=com.cnetwork.relevance  -DartifactId=target  -Dversion=1.0.0

mais quand je l'utilise, je trouve qu'il ya beaucoup d'erreur, le pot qui utilisent target.jar ne peut pas trouver a.jar, b.jar, c.jar, tels que:

com.cnetwork.a does not exist
com.cnetwork.b does not exist
com.cnetwork.c does not exist

Alors je suis allé à ~/.m2/repository/.../target/1.0.0/target.pom pour trouver le fichier pom de la cible, mais rien dedans!

...
<groupId>com.cnetwork.relevance</groupId>
<artifactId>target</artifactId>
<version>1.0.0</version>
....
# no dependencies about a/b/c.jar !!!

C'est ce qui va mal, l'install:file -Dfile -DgroupId -D.. ne pas ajouter des dépendances dans pom, je corrige la réponse par cette méthode

  1. si vous avez déjà have this maven project source, il suffit d'installer dans repo locale

    mvn clean install

  2. si vous have the jar and the pom of it, pot installer avec pom

    mvn install:install-file -Dfile=/.../.../target.jar -DpomFile=/.../../target.pom

  3. si vous don't have a pom with target jar, écrivez un et utilisez la commande supérieure.

  4. si vous ne pouvez pas récupérer le fichier pom de celui-ci, peut-être vous devriez abandonner.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top