成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

現學現用,寫個Maven插件用下

開發 前端
很多技術本身不復雜,合理使用與加工則可以將我們平時工作中重復相似的工作內容進行簡化,很多自動化工具亦是如此,只不過這些工作由別人完成了。通過今天的示例,主要了解如何將學到的知識具體化到工作中。

Maven 插件實踐

上一次簡單介紹了如何編寫一個Maven插件,并且如何將插件的執行與Maven生命周期綁定,這樣通過調用maven生命周期方法時,則會在配置的階段按照插件的目標來執行代碼。

今天通過一個具體的插件來熟悉在項目中的使用。

一般公司的項目結構或者代碼結構都是非常固定的,有一些框架針對這種固化的代碼結構或約定的規范,在開發前會嚴格對項目進行模塊劃分,對各個模塊的代碼結構也會嚴格要求。那么我們則可以根據這種約定的規范,通過工具來自動化的生成代碼,從而減少開發人員的工作量。

示例項目

比如我們的項目一般都會由多個模塊組成,比如下面的示例:

DMP
    ├ system
    │ ├ account
    │   ├ entity
    │   ├ dao
    │   └ service
    │   └ web
    │ ├ role
    │   ├ ...
    │ ├ permission
    │   ├ ...    
    │ └ pom.xml
    ├ monitor
    │ ├ database
    │   ├ ...
    │ ├ disk
    │   ├ ...
    │ ├ memory
    │   ├ ...    
    │ └ pom.xml
    └ pom.xml

在上面的例子中,我們項目包括了system、monitor等多個模塊,其中system模塊包含了account、role、permission三個子模塊, monitor模塊包含了database、disk、memory三個子模塊,每個子模塊又包含了特定的代碼結構. 這個屬于我們約定的模塊劃分規則,那么基于這樣的規則,我們完全可以通過開發一個插件來自動生成這種約定結構的空項目。

實現步驟

假設插件名稱為 `module-create-maven-plugin`,將來我們會通過該插件實現
項目模塊文件夾和一些通用文件的自動生成。插件大概配置如下:
<build>
   <plugins>
      <plugin>
         <groupId>com.sucls.blog.plugin</groupId>
         <artifactId>module-create-plugin</artifactId>
         <version>1.0.0</version>
         <configuration>
            <basedir>E:\\_projects\\demo\\DMP</basedir>
            <modules>
               <module>system/account</module>
               <module>system/role</module>
               <module>monitor/databse</module>
               <module>monitor/disk</module>
               <module>monitor/memory</module>
            </modules>
         </configuration>
      </plugin>
   </plugins>
</build>

根據我們預期要求,來設想插件的開發過程。

定義一個maven插件項目

創建一個maven插件項目,在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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.sucls.blog.plugin</groupId>
    <artifactId>module-create-plugin</artifactId>
    <version>1.0.0</version>
    <packaging>maven-plugin</packaging>

    <dependencies>
        <dependency>
            <groupId>org.apache.maven</groupId>
            <artifactId>maven-plugin-api</artifactId>
            <version>3.8.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.maven</groupId>
            <artifactId>maven-core</artifactId>
            <version>3.8.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.maven.plugin-tools</groupId>
            <artifactId>maven-plugin-annotations</artifactId>
            <version>3.8.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.32</version>
        </dependency>
    </dependencies>
</project>

創建一個Mojo根據配置添加實現邏輯

goal的名字設計成modules,由于最終項目是基于maven構建,所以會生成pom.xml,插件中的幾個參數就是為了生成pom而設計

@Mojo(name = "run")
public class ModulesCreatePlugin extends AbstractMojo {

    @Parameter(property = "basedir",defaultValue = "${project.basedir}")
    private String basedir;

    @Parameter
    private String project;

    @Parameter(property = "groupId",defaultValue = "${project.groupId}")
    private String groupId;
    @Parameter(property = "artifactId",defaultValue = "${project.artifactId}")
    private String artifactId;
    @Parameter(property = "version",defaultValue = "${project.version}")
    private String version;

    @Parameter
    private List<String> modules;


    private ModuleTemplateHelper moduleTemplateHelper;

    public ModulesCreatePlugin(){
        init();
    }

    public void init(){
        moduleTemplateHelper = new ModuleTemplateHelper();
    }

    @Override
    public void execute() throws MojoExecutionException, MojoFailureException {
        Log log = getLog();
        log.info(StringUtils.repeat("=",50));

        log.info(modules.toString());
        createModules();

        log.info(StringUtils.repeat("=",50));
    }

    private void createModules() {
        if(modules != null && modules.size() >0){
            List<File> moduleFiles = new ArrayList<>();

            modules.forEach(module -> {
                // 創建目錄
                File path = new File(basedir,module);
                path.mkdirs();
                moduleFiles.add(path);
            });

            Set<String> parentModules = new HashSet<>();

            // 添加pom.xml
            for (File module : moduleFiles) {
                File parent = module.getParentFile();
                parentModules.add(parent.getName());
                // 上級pom
                if( !new File(parent,"pom.xml").exists() ){
                    moduleTemplateHelper.process("pom.ftl", new ModuleEntity(groupId,project,version, parent.getName()),parent.getAbsolutePath()+"/pom.xml");
                }
                // 追繳module
                XmlUtils.appendModule(new File(parent,"pom.xml"), module.getName());

                // 模塊pom
                moduleTemplateHelper.process("jar.ftl", new ModuleEntity(groupId,parent.getName(),version,module.getName()),module.getAbsolutePath()+"/pom.xml");
                new File(module,"src/main/java").mkdirs();
                new File(module,"src/main/resources").mkdirs();
            }

            // 項目pom.xml追加module
            if(new File(basedir,"pom.xml").exists()){
                for (String parentModule : parentModules) {
                    XmlUtils.appendModule(new File(basedir,"pom.xml"), parentModule);
                }
            }
        }
    }

}

上面我們通過ModuleTemplateHelper輔助類結合freemaker框架,最后為各個模塊生成對應的pom.xml文件;通過自定義的XmlUtils工具類結合JDK Documentation API,實現父級模塊中modules節點的添加子module;

public class ModuleTemplateHelper {

    private Configuration configuration;

    public ModuleTemplateHelper() throws IOException {
        configuration = new Configuration(Configuration.VERSION_2_3_22);
        configuration.setTemplateLoader(new ClassTemplateLoader(this.getClass(), "/templates"));
        configuration.setDefaultEncoding("UTF-8");
    }

    public void process(String tpl, Object module, String outputPath){
        Template template = configuration.getTemplate(tpl);
        template.process(module, new FileWriter(outputPath));
    }
}
public class XmlUtils {

    static DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
    static TransformerFactory transformerFactory = TransformerFactory.newInstance();
    static DocumentBuilder documentBuilder;

    static {
        try {
            documentBuilder = documentBuilderFactory.newDocumentBuilder();
        } catch (ParserConfigurationException e) {
            throw new RuntimeException(e);
        }
    }
    

    /**
     *
     * @param pomXmlPath
     * @param moduleName
     */
    public static void appendModule(File pomXml, String moduleName) {
        try {
            Document document = documentBuilder.parse(pomXml);
            NodeList modules = document.getElementsByTagName("modules");
            Node modulesNode = null;
            if( modules.getLength()>0 ){
                modulesNode = modules.item(0);
            }
            if( modulesNode == null ){
                modulesNode = document.createElement("modules");
                document.appendChild(modulesNode);
            }
            // 追加
            Element module = document.createElement("module");
            module.setTextContent(moduleName);
            modulesNode.appendChild(module);

            // 保存
            transformerFactory.newTransformer().transform(new DOMSource(document), new StreamResult(pomXml));
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

生成插件

執行下面的命令即可生成插件jar,并安裝到本地倉庫

mvn clean package

在項目中調用插件

在項目中引入插件,并且按照需要的模塊添加配置,最后在IDEA右側則可以看到該插件,雙擊運行,最終項目結構如下圖:

結束語

很多技術本身不復雜,合理使用與加工則可以將我們平時工作中重復相似的工作內容進行簡化,很多自動化工具亦是如此,只不過這些工作由別人完成了。通過今天的示例,主要了解如何將學到的知識具體化到工作中。

責任編輯:武曉燕 來源: Java技術指北
相關推薦

2020-01-15 08:00:00

Python編程語言代碼

2021-09-13 16:40:30

Java C 語言游戲

2022-11-04 11:44:56

WebFluxCURDWeb

2023-10-31 08:21:18

WebFlux基本用法JPA

2017-03-29 11:20:45

maven插件總結

2021-06-29 07:04:38

爬蟲代碼Python

2022-11-03 08:07:54

Python工具navicat

2012-03-07 15:24:41

2021-07-19 07:01:20

Chrome 插件瀏覽器

2020-08-19 09:25:32

Python人臉識別人工智能

2021-01-13 10:28:16

Maven插件Mojo

2023-09-16 18:40:43

Java插件

2023-09-18 08:27:44

插件Java

2019-04-19 16:30:30

Python機器人代碼

2019-10-17 21:37:28

微信飛機大戰Python

2021-09-17 09:00:00

安全身份認證OAuth 2.0

2017-03-13 14:32:10

機器學習學習效率AI

2023-02-01 22:40:38

shellDocker

2023-09-04 07:30:03

Wasm匯編語言
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产在线精品免费 | 色婷婷久久久久swag精品 | 一区二区成人 | 久久久日韩精品一区二区三区 | 亚洲一区三区在线观看 | 国产乱码精品一区二区三区五月婷 | 成人黄色av | 亚洲精品一区二 | 天天操天天摸天天干 | 国产精品激情小视频 | 最新伦理片 | 亚洲人成在线观看 | 精品久久久久久久 | 久久亚洲精品久久国产一区二区 | 天天操天天射综合网 | 黄色一级视频 | 免费观看黄色片视频 | 国产精品国产三级国产播12软件 | 久草网址 | 国产探花在线精品一区二区 | 99国产精品久久久久久久 | 欧美精品日韩精品 | 在线欧美亚洲 | 精品国产一区二区三区性色av | 亚洲一二三区在线观看 | 中文字幕一区二区三区精彩视频 | 完全免费在线视频 | 日韩字幕 | 伊伊综合网| 免费激情网站 | 夜夜爽99久久国产综合精品女不卡 | 日日干日日射 | 国产精品区二区三区日本 | 天天拍夜夜爽 | 在线婷婷 | 亚洲欧美综合精品久久成人 | 91久久精品| 亚洲一区二区三区在线视频 | 日韩精品一区二区三区老鸭窝 | 91高清视频 | 日韩一级免费电影 |