With Plexus, it's very easy to use Maven SCM because it injects all dependencies in fields, so you only have to write minimal code.
import org.apache.maven.scm.manager.ScmManager;
public class MyApp
{
private ScmManager scmManager;
public MyApp()
{
plexus = new Embedder();
plexus.start();
scmManager = (ScmManager) plexus.lookup( ScmManager.ROLE );
}
public ScmManager getScmManager()
{
return scmManager;
}
Without Plexus, you must add all your SCM providers in the manager and that will require more work. You can use the basic SCM manager or write your own:
import org.apache.maven.scm.manager.BasicScmManager;
public class MyApp
{
private ScmManager scmManager;
public MyApp()
{
scmManager = new BasicScmManager();
//Add all SCM providers we want to use
scmManager.setScmProvider( "cvs", new CvsJavaScmProvider() );
scmManager.setScmProvider( "svn", new SvnExeScmProvider() );
...
}
public ScmManager getScmManager()
{
return scmManager;
}
Before you call a command, the SCM manager needs an ScmRepository. This object contains all the information about the SCM connection.
public ScmRepository getScmRepository( String scmUrl )
throw Exception
{
ScmRepository repository;
try
{
return getScmManager().makeScmRepository( scmUrl );
}
catch ( NoSuchScmProviderException ex )
{
throw new Exception( "Could not find a provider.", ex );
}
catch ( ScmRepositoryException ex )
{
throw new Exception( "Error while connecting to the repository", ex );
}
}
public void checkOut( ScmRepository scmRepository, File workingDirectory )
throws ScmException
{
if ( workingDirectory.exists() )
{
System.err.println( "The working directory already exist: '" + workingDirectory.getAbsolutePath() + "'." );
return;
}
if ( !workingDirectory.mkdirs() )
{
System.err.println(
"Error while making the working directory: '" + workingDirectory.getAbsolutePath() + "'." );
return;
}
CheckOutScmResult result = scmManager.checkOut( scmRepository, new ScmFileSet( workingDirectory ) );
checkResult( result );
List checkedOutFiles = result.getCheckedOutFiles();
System.out.println( "Checked out these files: " );
for ( Iterator it = checkedOutFiles.iterator(); it.hasNext(); )
{
ScmFile file = (ScmFile) it.next();
System.out.println( " " + file.getPath() );
}
}
public void update( ScmRepository scmRepository, File workingDirectory )
throws ScmException
{
if ( !workingDirectory.exists() )
{
System.err.println( "The working directory doesn't exist: '" + workingDirectory.getAbsolutePath() + "'." );
return;
}
UpdateScmResult result = scmManager.update( scmRepository, new ScmFileSet( workingDirectory ) );
checkResult( result );
List updatedFiles = result.getUpdatedFiles();
System.out.println( "Updated these files: " );
for ( Iterator it = updatedFiles.iterator(); it.hasNext(); )
{
ScmFile file = (ScmFile) it.next();
System.out.println( " " + file.getPath() );
}
}
In each sample command code, we use the checkResult method, it isn't required but can be useful if something failed in the command execution.
public void checkResult( ScmResult result )
throws Exception
{
if ( !result.isSuccess() )
{
System.err.println( "Provider message:" );
System.err.println( result.getProviderMessage() == null ? "" : result.getProviderMessage() );
System.err.println( "Command output:" );
System.err.println( result.getCommandOutput() == null ? "" : result.getCommandOutput() );
throw new Exception(
"Command failed." + StringUtils.defaultString( result.getProviderMessage() ) );
}
}
The code above is available here: Maven-SCM client.