2009-07-15 10 views
3

Comment puis-je valider un seul artefact comme un fichier ou un répertoire dans un emplacement arbitraire dans un référentiel svn pendant la phase de cycle de déploiement? Avec référentiel, je veux dire un référentiel Subversion simple ici, pas un référentiel Maven détenu dans un dépôt Subversion!Maven: Valider un seul artefact dans le référentiel svn

J'ai déjà évalué le wagon-svn mais il semble qu'il peut juste être employé pour commettre une construction entière de module à un dépôt de Maven tenu dans un dépôt de Subversion.

Voici mon cas d'utilisation: Je génère un fichier JAR incluant toutes les dépendances lors de la construction. Ceci doit être utilisé dans les scripts Python, donc en dehors du monde Maven. Et je veux fournir la version actuelle de JAR toujours au même endroit dans le référentiel contenant le framework Python.

Répondre

3

Avant que vous fassiez ceci, j'examinerais soigneusement vos raisons pour le faire. Les artefacts dérivés ne doivent pas être mis dans SCM car ils peuvent facilement être reconstruits, vous pouvez à la place attacher l'artefact à votre build afin qu'il soit déployé à côté de lui. Cela peut être fait avec le plugin build-helper-maven-plugin. L'exemple de configuration ci-dessous va attacher src/assembly/archive.xml comme artefact supplémentaire avec le classificateur "archive".

<plugin> 
    <inherited>true</inherited> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>build-helper-maven-plugin</artifactId> 
    <executions> 
     <execution> 
     <id>attach-artifacts</id> 
     <phase>deploy</phase> 
     <goals> 
      <goal>attach-artifact</goal> 
     </goals> 
     <configuration> 
      <artifacts> 
       <artifact> 
       <file>src/assembly/archive.xml</file> 
       <type>xml</type> 
       <classifier>archive</classifier> 
       </artifact> 
      </artifacts> 
     </configuration> 
     </execution> 
    </executions> 
    </plugin> 
</plugins> 

Cet artefact peut être directement référencé en spécifiant le classificateur et le type dans votre déclaration de dépendance. Par exemple:

<dependency> 
    <groupId>my.group.id</groupId> 
    <artifactId>artifact-id</artifactId> 
    <version>1.0.0</version> 
    <type>xml</type> 
    <classifier>archive</classifier> 
</dependency> 

Si vous définissez sur ce faire de cette façon, la Maven SCM API fournit une couche d'abstraction pour les fournisseurs de SCM communs et des opérations. Le code ci-dessous can be added to a mojo. Il s'attend à recevoir deux paramètres, le fichier à commettre à Subversion et l'URL scm. Lorsqu'il est lié à votre projet, il va commettre le fichier dans le dépôt Subversion.

package name.seller.rich; 

import java.io.File; 

import org.apache.maven.plugin.AbstractMojo; 
import org.apache.maven.plugin.MojoExecutionException; 
import org.apache.maven.plugin.MojoFailureException; 
import org.apache.maven.scm.ScmException; 
import org.apache.maven.scm.ScmFileSet; 
import org.apache.maven.scm.command.add.AddScmResult; 
import org.apache.maven.scm.manager.ScmManager; 
import org.apache.maven.scm.provider.ScmProvider; 
import org.apache.maven.scm.provider.svn.repository.SvnScmProviderRepository; 
import org.apache.maven.scm.repository.ScmRepository; 

/** 
* @goal checkin-file 
*/ 
public class SVNCheckinMojo extends AbstractMojo { 

    /** 
    * @component 
    * @required 
    */ 
    private ScmManager manager; 

    /** 
    * @component 
    * @required 
    */ 
    private ScmProvider provider; 

    /** 
    * @parameter 
    * @required 
    */ 
    private String connectionUrl; 

    /** 
    * @parameter 
    * @required 
    */ 
    private File svnFile; 

    /** 
    * Obtain the SVN repository. 
    */ 
    public ScmRepository getRepository() throws MojoExecutionException { 
     try { 
      ScmRepository repository = manager.makeScmRepository(connectionUrl); 

      if (!(repository.getProviderRepository() instanceof SvnScmProviderRepository)) { 
       throw new MojoExecutionException(
         "the scm provider is not an SVN provider"); 
      } 

      return repository; 
     } catch (Exception e) { 
      throw new MojoExecutionException(
        "Unable to obtain SCM repositorys", e); 
     } 
    } 

    public void execute() throws MojoExecutionException, MojoFailureException { 
     ScmRepository repository = getRepository(); 

     File dir = svnFile.getParentFile(); 
     File file = new File(svnFile.getName()); 
     ScmFileSet fileSet = new ScmFileSet(dir, file); 
     try { 

      AddScmResult result = provider.add(repository, fileSet); 

      if (!result.isSuccess()) { 
       throw new MojoExecutionException("unable to add file \"" 
         + svnFile + "\" to SCM URL \"" + connectionUrl + "\""); 
      } 
     } catch (ScmException e) { 
      throw new MojoExecutionException(
        "failed to commit file to repository", e); 
     } 
    } 
} 

Voici un exemple pom pour le plug-in, notez le maven-plugin emballage:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-svn-hack-plugin</artifactId> 
    <packaging>maven-plugin</packaging> 
    <version>0.0.1</version> 
    <dependencies> 
    <dependency> 
     <groupId>org.apache.maven</groupId> 
     <artifactId>maven-plugin-api</artifactId> 
     <version>2.0</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.maven</groupId> 
     <artifactId>maven-project</artifactId> 
     <version>2.0</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.maven.scm</groupId> 
     <artifactId>maven-scm-api</artifactId> 
     <version>1.2</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.maven.scm</groupId> 
     <artifactId>maven-scm-provider-svnexe</artifactId> 
     <version>1.2</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.maven.scm</groupId> 
     <artifactId>maven-scm-manager-plexus</artifactId> 
     <version>1.2</version> 
    </dependency> 
    <dependency> 
     <groupId>org.codehaus.plexus</groupId> 
     <artifactId>plexus-utils</artifactId> 
     <version>1.5.1</version> 
    </dependency> 
    </dependencies> 
</project> 

Voici un exemple de configuration qui vérifiera le fichier en cours de la phase de package.

<build> 
    <plugins> 
    <plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-svn-hack-plugin</artifactId> 
    <version>0.0.1</version> 
    <configuration> 
    <connectionUrl>scm:svn:http://svn.apache.org/svn/root/module</connectionUrl> 
    <svnFile>${project.build.directory}/${artifactId}-${version}-test.txt</svnFile> 
    </configuration> 
    <executions> 
    <execution> 
     <id>checkin-file</id> 
     <phase>package</phase> 
     <goals> 
     <goal>checkin-file</goal> 
     </goals> 
    </execution> 
    </executions> 
    </plugin> 
    </plugins> 
</build> 

Ou à la rigueur, vous pouvez utiliser le antrun plugin pour appeler la ant subversion library

+0

Ce n'est pas exactement ce que je veux faire. Pourriez-vous revoir ma question éditée? – desolat

+1

La deuxième partie de ma réponse décrit comment obtenir SVNScmProviderRepository. Avec cela, vous pouvez invoquer des commandes arbitraires sur Subversion. Si cela ne répond pas à vos besoins, je ne sais pas ce que signifie votre modification. Pourriez-vous élaborer? –

+0

@Rich: C'était vraiment utile, mais je n'arrivais pas à le faire fonctionner jusqu'à maintenant. Voici la description du problème: Comme add() échoue constamment, j'ai ajouté un appel provider.validateScmUrl(), qui échoue également. Lequel des éléments suivants pourrait être la raison de cela? 1. Je dois utiliser auth avec le svn, donc j'ai ajouté le nom d'utilisateur: passwort @ avant le nom d'hôte. 2. Je dois utiliser https. Donc l'URL est comme scm: svn: https: // nom d'utilisateur: [email protected]/path. Est-ce que c'est faux? Comment faire auth alors? Des liens vers la documentation? Le projet scm est assez rare. – desolat

Questions connexes