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
Ce n'est pas exactement ce que je veux faire. Pourriez-vous revoir ma question éditée? – desolat
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? –
@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