2009-07-15 53 views
3

如何在部署生命週期階段將單個工件(如文件或目錄)提交到svn存儲庫中的任意位置? 有了存儲庫,我的意思是一個普通的Subversion存儲庫,而不是一個存放在Subversion存儲庫中的Maven存儲庫!Maven:將單個工件提交到svn存儲庫

我已經評估了wagon-svn,但它似乎只能用於將整個模塊構建提交到保存在Subversion存儲庫中的Maven存儲庫中。

這是我的用例:我在生成過程中生成一個包含所有依賴關係的JAR文件。這是在Python腳本中使用的,所以在Maven世界之外。我想提供當前版本的JAR,始終在存放Python框架的倉庫中的相同位置。

回答

3

在你這樣做之前,我會仔細考慮你這樣做的理由。 派生的工件不應放入SCM中,因爲它們可以輕鬆地重建,您可以考慮將工件附加到您的構建中,以便將其部署在其中。

這可以用build-helper-maven-plugin完成。下面的示例配置將附加src/assembly/archive.xml作爲分類器「歸檔」的附加工件。

<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> 

此工件可以直接通過指定分類器並在您的依賴聲明中輸入來引用。例如:

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

如果你在做這種方式設置時,Maven SCM API提供了常見的SCM提供商和運營一個抽象層。下面的代碼can be added to a mojo。它期望提供兩個參數,即提交給Subversion的文件和scm url。綁定到你的項目時,它會將該文件提交到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); 
     } 
    } 
} 

下面是插件爲例POM,注意Maven的插件包裝:

<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> 

下面是示例配置,其將在封裝階段檢查的文件中。

<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> 

或在必要時你可以使用antrun plugin調用ant subversion library

+0

這不正是我想做的事情。你能回顧我編輯的問題嗎? – desolat 2009-07-29 12:31:42

相關問題