2011-06-28 4 views
3

J'ai un projet maven - c'est un plugin pour jenkins. Il est parent devrait être:Maven: Sélection du projet parent basé sur le profil

<parent> 
    <groupId>org.jenkins-ci.plugins</groupId> 
    <artifactId>plugin</artifactId> 
    <version>1.414</version> 
</parent> 

Mais en même temps, ce plugin peut également être utilisé pour hudson, sans changer une ligne de code. Mais le projet parent pour qu'il devrait être:

<parent> 
    <groupId>org.jvnet.hudson.plugins</groupId> 
    <artifactId>hudson-plugin-parent</artifactId> 
    <version>2.0.1</version> 
</parent> 

Puis-je spécifier 2 profils différents pour cela et les utiliser pour construire ou plug-in pour jenkins hudson en conséquence? Alors que j'appelle quelque chose comme ça:

mvn package -P jenkins 

ou

mvn package -P hudson 

J'ai essayé de définir les propriétés dans les profils, mais ce ne sont pas remplacés par leurs valeurs dans la balise <parent>. Donc, y a-t-il une autre possibilité de construire un plugin pour les deux, mais avec autant de code et de fichiers communs?

Ajouté: Donc, si je ne peux pas le faire, que dois-je faire? Comment refactoriser? Quelle devrait être la nouvelle structure?

Répondre

0

Actuellement, nous avons décidé de coller avec 1 dépôt et 2 fichiers pom.xml séparés, donnant la clé maven que pom.xml utilise pour construire le projet.

mvn package -f pom-jenkins.xml 
mvn package -f pom-hudson.xml 
0

Non, vous ne pouvez pas faire cela. vous devrez refactoriser d'une manière ou d'une autre pour éviter la nécessité.

0

Comme mentionné déjà pas possible. Je suggérerais de faire des projets séparés pour le plugin jenkins et le plugin hudson. Je suppose que dans un avenir pas si loin que ça ne marchera plus parce que Hudons et Jenkins vont diverger.

1

Ce n'est pas possible parce que l'étiquette "parent" n'est pas disponible dans le profiles section du pom.

2

Comme déjà mentionné, ce n'est pas possible. De même, il n'est pas possible de définir une propriété pour la version du parent car l'interpolation pour cela se produit beaucoup plus tôt que la gestion des profils.

Je suggère que vous créez un projet masterbuild comme suit:

master 
|-plugin-jenkins 
|-plugin-hudson 
|-plugin-assembly 

Le maître doit construire trois comme d'habitude. Toutefois, dans l'assembly, vous pouvez ajouter chacun des deux plugins en tant que dépendances dans des profils distincts. Et ... chacun de ces plugins peut avoir le parent que vous aimez.

Ceci est évidemment un peu une déviation de la convention Maven, mais je crois que c'est une solution à votre problème.

+0

Merci, je vais essayer. Mais de cette façon je dois avoir 2 copies de mon code: dans plugin-jenkins et dans plugin-hudson. Peut-on le faire d'une certaine manière, que je construis hudson basé sur le code jenkins ou vice versa? –

+0

Eh bien, je dirais que vous avez deux projets distincts pour l'emballage de ce (au moins). Comme l'a souligné Karl-Heinz, Hudson et Jenkins se sont séparés et il est probable que les choses qui fonctionnent (encore) ne fonctionneront pas dans un proche avenir. Vous pouvez conserver la majeure partie du code dans un module de base et avoir ensuite les éléments spécifiques à Hudson ou Jenkins dans le module de conditionnement (qui dépend du cœur). Quelque chose dans ce sens devrait résoudre votre problème. – carlspring

0

En général, vous devriez être en mesure de régler le {groupe, artefact} Id et la version du POM parent via Java Propriétés système ou des variables d'environnement, mais il semble qu'il y ait un bogue dans Maven qui ne sera corrigé dans 4.x: https://issues.apache.org/jira/browse/MNG-624

Une autre solution consiste à déléguer l'inclusion du POM parent à vos propres POM parentaux que vous référencez dans l'élément relatifPath, et à modifier le contenu de la cible par exemple via un lien symbolique ou une commande cp.

Ainsi, dans le principal POM vous pouvez écrire:

<parent> 
    <groupId>org.mycompany.project</groupId> 
    <artifactId>foo-artifact</artifactId> 
    <version>1.0.0</version> 
    <relativePath>./my-parent.pom</relativePath> 
</parent> 

Et dans mes parentes-jenkins vous serait tout simplement mettre:

<groupId>org.mycompany.project</groupId> 
<artifactId>foo-artifact</artifactId> 
<version>1.0.0</version> 

<parent> 
    <groupId>org.jenkins-ci.plugins</groupId> 
    <artifactId>plugin</artifactId> 
    <version>1.414</version> 
</parent> 

Les mêmes informations de projet avec le bloc de hudson vous mettez dans mon-parent-hudson.pom.

Non, vous pouvez utiliser

ln -s my-parent-jenkins.pom my-parent.pom 

ou

ln -s my-parent-hudson.pom my-parent.pom 

pour inclure le POM parent respectif sans la nécessité de maintenir deux fichiers principaux POM différents pour votre projet. Dans le cas où POM n'existe pas à l'endroit référencé dans relativePath, Maven recherchera le POM dans le référentiel distant [1], ce qui est également un moyen facile d'écraser localement un POM parent.

[1] http://maven.apache.org/components/ref/3.3.9/maven-model/maven.html#class_parent

Questions connexes