zoukankan      html  css  js  c++  java
  • 自定义maven插件

    1、pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <!--打包方式   这里区别于普通maven项目-->
        <packaging>maven-plugin</packaging>
    
        <groupId>cn.com.test</groupId>
        <artifactId>encrytfilepack</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    
    
        <dependencies>
    
            <dependency>
                <groupId>org.apache.maven</groupId>
                <artifactId>maven-plugin-api</artifactId>
                <version>3.5.2</version>
            </dependency>
            <dependency>
                <groupId>org.apache.maven.plugin-tools</groupId>
                <artifactId>maven-plugin-annotations</artifactId>
                <version>3.5.2</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot</artifactId>
                <version>2.3.4.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-autoconfigure</artifactId>
                <version>2.3.4.RELEASE</version>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-plugin-plugin</artifactId>
                    <version>3.5.2</version>
                    <!-- 插件执行命令前缀 -->
                    <configuration>
                        <goalPrefix>encrypt</goalPrefix>
                        <skipErrorNoDescriptorsFound>true</skipErrorNoDescriptorsFound>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    
    </project>

    具体实现:这个方法测试的是给具体文件进行加密操作,也可以自定义。

    package cn.com.test.util;
    
    import org.apache.maven.plugin.AbstractMojo;
    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.springframework.core.io.ClassPathResource;
    import org.springframework.core.io.Resource;
    import org.springframework.util.ResourceUtils;
    
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    
    
    /**
     * author scl
     * date 2020/10/28 0028 14:36
     */
    // mojo注解就是maven插件的注解,具体什么我忘记了。name就是后面使用该插件的时候excuation里面的,
    // 后面配置的是生命周期,我这里配置了install,即默认是安装时候执行本插件(这个可以在pom文件指定)
     @Mojo(name = "encryptresource", defaultPhase = LifecyclePhase.INSTALL) public class EncryptResource extends AbstractMojo { private final String pre_path = "src/main/resources/static/";

      
       // 配置的是本maven插件的位置,在pom使用configuration标签进行配置property就是名字 @Parameter(property = "sourceFolderPath") String sourceFolderPath; public void execute() throws MojoExecutionException, MojoFailureException { System.out.println("this is encrypt file logs!"); System.out.println(sourceFolderPath); //对path进行加密 if (sourceFolderPath.contains(",")) { String[] split = sourceFolderPath.split(","); encryptFile(split); } else { encryptFile(sourceFolderPath); } } private void encryptFile(String... path) { String[] strArr = path; for (int i = 0; i < strArr.length; i++) { String path1 = ""; try { path1 = ResourceUtils.getURL(pre_path + strArr[i]).getPath(); File file = new File(path1); System.out.println(file.getAbsolutePath()); System.out.println(file.getName()); EncyptUtil.Base64Encryt(file, file); System.out.println("[INFO]:----------"); System.out.println(strArr[i] + ":--success--"); } catch (IOException e) { System.out.println("[INFO]:----------"); e.printStackTrace(); System.out.println(strArr[i] + "--fail"); continue; } } } }

    然后执行:maven clean install

    把插件打到本地仓库。

    另一个项目引用插件:

    pom文件:

    <!--加密过程-->
                <plugin>
                    <groupId>cn.com.test</groupId>
                    <artifactId>encrytfilepack</artifactId>
                    <version>0.0.1-SNAPSHOT</version>
                    <executions>
                        <execution>
                            <goals>
                                <goal>encryptresource</goal>
                            </goals>
                   <!--重要点-->  <phase>package</phase> </execution> </executions> <configuration> <sourceFolderPath>blue.svg</sourceFolderPath> </configuration> </plugin>

    执行package即可看到日志输出。

    ps:还遇到一个关于maven仓库的问题:

    maven  Error extracting plugin descriptor: 'invalid distance too far back'

    有关是因为maven仓库的包不完整,把maven仓库指定的包删掉再从新下载即可;删掉了org下的,现在还在下载中,哭了

    ps2:

    maven生命周期:

    其中,这边的需求是在项目打包之前对指定文件进行加密处理,自己在按照上面的插件写完之后,执行完package,但是本地文件进行加密了,但是打包完的文件并没有加密,根据日志定位出来是maven的插件执行顺序问题,因为都是package格式,所以实在是找不到怎么定义顺序,自定义的总是在打包完执行;所以通过看https://zhuanlan.zhihu.com/p/139485157的相关,把自定义的格式改为compile,这样可定在打包之前执行。

  • 相关阅读:
    ID,ClientID,UniqueID的区别
    Struct构造函数
    关于sizeof,typeof
    C#文件读写
    code1
    .NET中加密与解密QueryString的方法
    addEventListener和attachEvent的区别
    执行带参数的存储过程
    如何得到机器上装的Powershell的版本
    [Gradle] How to determine OS info
  • 原文地址:https://www.cnblogs.com/notchangeworld/p/13901686.html
Copyright © 2011-2022 走看看