在下一节中,我们将详细了解编写新的 Maven SCM 提供程序的所有步骤。
您的项目需要使用 Maven SCM 框架中的一些 jar。将它们添加到您的 POM。
<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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <artifactId>maven-scm-providers</artifactId> <groupId>org.apache.maven.scm</groupId> <version>LATEST VERSION OF MAVEN-SCM PROVIDERS MASTER POM</version> </parent> <artifactId>maven-scm-provider-YOUR_PROVIDER_NAME</artifactId> <version>1.0-SNAPSHOT</version> <name>My Maven SCM Provider</name> <build> <plugins> <plugin> <groupId>org.codehaus.plexus</groupId> <artifactId>plexus-component-metadata</artifactId> <version>1.7.1</version> <executions> <execution> <goals> <goal>generate-metadata</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
plexus-component-metadata maven 插件将生成 Maven SCM 管理器使用的 Plexus 元数据文件。
此类将包含有关您的 SCM 连接的所有 SCM 信息(用户、密码、主机、端口、路径...)。
package org.apache.maven.scm.provider.myprovider.repository; import org.apache.maven.scm.provider.ScmProviderRepository; public class MyScmProviderRepository extends ScmProviderRepository { }
在向此类添加更多信息之前,您可以查看ScmProviderRepository子类(如果它们已实现)。
这个类是提供者的中心点。Maven SCM 框架将只知道提供程序中的此类,因此此类必须验证 scm url,填充ScmProviderRepository并提供您的提供程序支持的所有命令。我们从一个基本类开始,然后在实现它们时向它添加命令。
在开始编写 SCM 提供程序之前,您必须定义要支持的 SCM URL。
package org.apache.maven.scm.provider.myprovider; import org.apache.maven.scm.provider.myprovider.repository.MyScmProviderRepository; import org.apache.maven.scm.provider.AbstractScmProvider; import org.apache.maven.scm.provider.ScmProviderRepository; import org.apache.maven.scm.repository.ScmRepositoryException; /** * @plexus.component role="org.apache.maven.scm.provider.ScmProvider" role-hint="provider_name" */ public class MyScmProvider extends AbstractScmProvider { public String getScmType() { return "provider_name"; } /** * This method parse the scm URL and return a SCM provider repository. * At this point, the scmSpecificUrl is the part after scm:provider_name: in your SCM URL. */ public ScmProviderRepository makeProviderScmRepository( String scmSpecificUrl, char delimiter ) throws ScmRepositoryException { MyScmProviderRepository providerRepository = new MyScmProviderRepository(); //Parse scmSpecificUrl and populate there your provider repository return providerRepository; } }
plexus.component javadoc 标签将被 POM 中声明的 plexus maven 插件用来生成 plexus 元数据。通常,我们在 scm URL 中使用scm:之后的字符串作为provider_name。
当您编写新的 SCM 命令时,您必须扩展 Maven SCM 框架的基类。对于 Maven SCM 支持的每个命令,我们都有一个基本命令,每个命令都有一个返回 SCM 结果的执行方法。
package org.apache.maven.scm.provider.myprovider.command.checkout; import org.apache.maven.scm.command.checkout.AbstractCheckOutCommand; public class MyCheckoutCommand extends AbstractCheckOutCommand { protected abstract CheckOutScmResult executeCheckOutCommand( ScmProviderRepository repository, ScmFileSet fileSet, String tag ) throws ScmException { CheckOutScmResult result = new CheckOutScmResult(); //Add the code there to run the command //If you need to run a native commandline like git/svn/..., look at other providers how to launch it and parse the output return result; } }
现在您的命令已实现,您需要将其添加到您的 SCM 提供程序 ( MyScmProvider ) 中。打开提供程序类并覆盖与您的命令相关的方法。
public class MyScmProvider extends AbstractScmProvider { ... protected CheckOutScmResult checkout( ScmRepository repository, ScmFileSet fileSet, CommandParameters params ) throws ScmException { MyCheckoutCommand command = new MyCheckoutCommand(); command.setLogger( getLogger() ); return (CheckOutScmResult) command.execute( repository.getProviderRepository(), fileSet, params ); } }