修复Maven项目默认文件夹的Maven Plugin开发

总体说Maven Plugin开发算是比较简单,了解了Mojo之后,实现起Maven Plugin的一个个goal就更加轻松了。

由于发现在通过eclipse或者archetype创建Maven工程之后,src下的目录时而不完整,于是打起开发一个Maven Plugin的主意。该插件命名为:hello-maven-plugin,此外Apache Maven官方声明过Maven Plugin命名需要注意的问题,Maven官方的Plugin命名格式为:maven-<plugin name>-plugin,其它个人或者组织可以使用<plugin name>-maven-plugin命名,当然不限于此。不过使用这种命名格式有个好处是在使用Plugin的时候可以通过 mvn plugin:goal 命令来进行操作,可以省去完整限定名。

下面将是开发该插件的具体步骤:

创建hello-maven-plugin的Maven工程

在pom.xml中添加依赖和maven-plugin-plugin插件

<dependencies>
        <dependency>
            <groupId>org.apache.maven</groupId>
            <artifactId>maven-plugin-api</artifactId>
            <version>2.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.maven.plugin-tools</groupId>
            <artifactId>maven-plugin-annotations</artifactId>
            <version>3.4</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.maven</groupId>
            <artifactId>maven-core</artifactId>
            <version>3.1.0</version>
        </dependency>
    </dependencies>

<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-plugin-plugin</artifactId>
                <version>3.4</version>
                <executions>
                    <execution>
                        <id>default-descriptor</id>
                        <phase>process-classes</phase>
                    </execution>
                </executions>
            </plugin>

需要注意的事,Mojo对象的通过Java doc Tag或者Java Annotation的注释的方式都可以通过处理生产plugin.xml的描述文件,这里使用Java Annotation。

详情:

3.编写Mojo
  通常一个Plugin中可能有多个goal,这里我们把多个Mojo的共同部分提取到父类,该父类是抽象类,并未实现execute方法,而是由每个实现特定goal的Mojo来实现。
 
package secondriver.maven.plugin.hello;
 
import org.apache.maven.plugin.AbstractMojo;
 
public abstract class BaseMojo extends AbstractMojo {
 
    public void printLine() {
        getLog().info(
                "------------------------------------------------------------------------");
    }
}


package secondriver.maven.plugin.hello;
 
import java.io.File;
 
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.project.MavenProject;
 
@Mojo(name = "fixdir", requiresProject = true, threadSafe = true, defaultPhase = LifecyclePhase.NONE)
public class FixDir extends BaseMojo {
 
    @Parameter(defaultValue = "${project}")
    private MavenProject project;
 
    @Parameter(defaultValue = "${project.basedir}", readonly = true)
    private File baseDir;
 
    private String srcDir = "/src";
 
    private String mainJava = "/main/java";
 
    private String mainResources = "/main/resources";
 
    private String testJava = "/test/java";
    private String testResources = "/test/resources";
 
    @Parameter(name = "packageName", property = "fixdir.packageName", defaultValue = "${project.groupId}", required = true)
    private String packageName;
 
    public void execute() throws MojoExecutionException, MojoFailureException {
        String packagePath = packageName.replace(".", File.separator);
 
        // 创建关于main的目录
        mkdirs(mainJava + File.separator + packagePath);
        mkdirs(mainResources);
 
        // 创建关于test的目录
        mkdirs(testJava + File.separator + packagePath);
        mkdirs(testResources);
    }
 
    private void mkdirs(String path) throws MojoFailureException {
        File file = new File(baseDir, srcDir + File.separator + path);
        if (!file.exists()) {
            if (file.mkdirs()) {
                getLog().info(path + " created OK.");
            } else {
                getLog().error(path + " created Failed.");
                throw new MojoFailureException("Fix " + mainJava + ", "
                        + mainResources + ", " + testJava + ", "
                        + testResources + " Failed.");
            }
        }
    }
}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/16526.html