日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
現(xiàn)學(xué)現(xiàn)用,寫(xiě)個(gè)Maven插件用下

Maven 插件實(shí)踐

上一次簡(jiǎn)單介紹了如何編寫(xiě)一個(gè)Maven插件,并且如何將插件的執(zhí)行與Maven生命周期綁定,這樣通過(guò)調(diào)用maven生命周期方法時(shí),則會(huì)在配置的階段按照插件的目標(biāo)來(lái)執(zhí)行代碼。

專注于為中小企業(yè)提供成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)江夏免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上1000家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

今天通過(guò)一個(gè)具體的插件來(lái)熟悉在項(xiàng)目中的使用。

一般公司的項(xiàng)目結(jié)構(gòu)或者代碼結(jié)構(gòu)都是非常固定的,有一些框架針對(duì)這種固化的代碼結(jié)構(gòu)或約定的規(guī)范,在開(kāi)發(fā)前會(huì)嚴(yán)格對(duì)項(xiàng)目進(jìn)行模塊劃分,對(duì)各個(gè)模塊的代碼結(jié)構(gòu)也會(huì)嚴(yán)格要求。那么我們則可以根據(jù)這種約定的規(guī)范,通過(guò)工具來(lái)自動(dòng)化的生成代碼,從而減少開(kāi)發(fā)人員的工作量。

示例項(xiàng)目

比如我們的項(xiàng)目一般都會(huì)由多個(gè)模塊組成,比如下面的示例:

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

在上面的例子中,我們項(xiàng)目包括了system、monitor等多個(gè)模塊,其中system模塊包含了account、role、permission三個(gè)子模塊, monitor模塊包含了database、disk、memory三個(gè)子模塊,每個(gè)子模塊又包含了特定的代碼結(jié)構(gòu). 這個(gè)屬于我們約定的模塊劃分規(guī)則,那么基于這樣的規(guī)則,我們完全可以通過(guò)開(kāi)發(fā)一個(gè)插件來(lái)自動(dòng)生成這種約定結(jié)構(gòu)的空項(xiàng)目。

實(shí)現(xiàn)步驟

假設(shè)插件名稱為 `module-create-maven-plugin`,將來(lái)我們會(huì)通過(guò)該插件實(shí)現(xiàn)
項(xiàng)目模塊文件夾和一些通用文件的自動(dòng)生成。插件大概配置如下:

   
      
         com.sucls.blog.plugin
         module-create-plugin
         1.0.0
         
            E:\\_projects\\demo\\DMP
            
               system/account
               system/role
               monitor/databse
               monitor/disk
               monitor/memory
            
         
      
   

根據(jù)我們預(yù)期要求,來(lái)設(shè)想插件的開(kāi)發(fā)過(guò)程。

定義一個(gè)maven插件項(xiàng)目

創(chuàng)建一個(gè)maven插件項(xiàng)目,在pom.xml中添加如下配置:




    4.0.0

    com.sucls.blog.plugin
    module-create-plugin
    1.0.0
    maven-plugin

    
        
            org.apache.maven
            maven-plugin-api
            3.8.1
        
        
            org.apache.maven
            maven-core
            3.8.1
        
        
            org.apache.maven.plugin-tools
            maven-plugin-annotations
            3.8.1
            provided
        
        
            org.freemarker
            freemarker
            2.3.32
        
    

創(chuàng)建一個(gè)Mojo根據(jù)配置添加實(shí)現(xiàn)邏輯

goal的名字設(shè)計(jì)成modules,由于最終項(xiàng)目是基于maven構(gòu)建,所以會(huì)生成pom.xml,插件中的幾個(gè)參數(shù)就是為了生成pom而設(shè)計(jì)

@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 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 moduleFiles = new ArrayList<>();

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

            Set parentModules = new HashSet<>();

            // 添加pom.xml
            for (File module : moduleFiles) {
                File parent = module.getParentFile();
                parentModules.add(parent.getName());
                // 上級(jí)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();
            }

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

}

上面我們通過(guò)ModuleTemplateHelper輔助類結(jié)合freemaker框架,最后為各個(gè)模塊生成對(duì)應(yīng)的pom.xml文件;通過(guò)自定義的XmlUtils工具類結(jié)合JDK Documentation API,實(shí)現(xiàn)父級(jí)模塊中modules節(jié)點(diǎn)的添加子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);
        }
    }
}

生成插件

執(zhí)行下面的命令即可生成插件jar,并安裝到本地倉(cāng)庫(kù)

mvn clean package

在項(xiàng)目中調(diào)用插件

在項(xiàng)目中引入插件,并且按照需要的模塊添加配置,最后在IDEA右側(cè)則可以看到該插件,雙擊運(yùn)行,最終項(xiàng)目結(jié)構(gòu)如下圖:

結(jié)束語(yǔ)

很多技術(shù)本身不復(fù)雜,合理使用與加工則可以將我們平時(shí)工作中重復(fù)相似的工作內(nèi)容進(jìn)行簡(jiǎn)化,很多自動(dòng)化工具亦是如此,只不過(guò)這些工作由別人完成了。通過(guò)今天的示例,主要了解如何將學(xué)到的知識(shí)具體化到工作中。


分享名稱:現(xiàn)學(xué)現(xiàn)用,寫(xiě)個(gè)Maven插件用下
文章鏈接:http://m.5511xx.com/article/coggoog.html