日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁(yè) > 科技  > 軟件

現(xiàn)學(xué)現(xiàn)用,寫(xiě)個(gè)Maven插件用下

來(lái)源: 責(zé)編: 時(shí)間:2024-01-15 09:19:39 239觀看
導(dǎo)讀Maven 插件實(shí)踐上一次簡(jiǎn)單介紹了如何編寫(xiě)一個(gè)Maven插件,并且如何將插件的執(zhí)行與Maven生命周期綁定,這樣通過(guò)調(diào)用maven生命周期方法時(shí),則會(huì)在配置的階段按照插件的目標(biāo)來(lái)執(zhí)行代碼。今天通過(guò)一個(gè)具體的插件來(lái)熟悉在項(xiàng)目中

Maven 插件實(shí)踐

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

今天通過(guò)一個(gè)具體的插件來(lái)熟悉在項(xiàng)目中的使用。8d928資訊網(wǎng)——每日最新資訊28at.com

一般公司的項(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ā)人員的工作量。8d928資訊網(wǎng)——每日最新資訊28at.com

示例項(xiàng)目

比如我們的項(xiàng)目一般都會(huì)由多個(gè)模塊組成,比如下面的示例:8d928資訊網(wǎng)——每日最新資訊28at.com

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)目。8d928資訊網(wǎng)——每日最新資訊28at.com

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

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

根據(jù)我們預(yù)期要求,來(lái)設(shè)想插件的開(kāi)發(fā)過(guò)程。8d928資訊網(wǎng)——每日最新資訊28at.com

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

創(chuàng)建一個(gè)maven插件項(xiàng)目,在pom.xml中添加如下配置:8d928資訊網(wǎng)——每日最新資訊28at.com

<?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>

創(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ì)8d928資訊網(wǎng)——每日最新資訊28at.com

@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 -> {                // 創(chuàng)建目錄                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());                // 上級(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;8d928資訊網(wǎng)——每日最新資訊28at.com

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ù)8d928資訊網(wǎng)——每日最新資訊28at.com

mvn clean package

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

在項(xiàng)目中引入插件,并且按照需要的模塊添加配置,最后在IDEA右側(cè)則可以看到該插件,雙擊運(yùn)行,最終項(xiàng)目結(jié)構(gòu)如下圖:8d928資訊網(wǎng)——每日最新資訊28at.com

結(jié)束語(yǔ)

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

本文鏈接:http://www.www897cc.com/showinfo-26-60918-0.html現(xiàn)學(xué)現(xiàn)用,寫(xiě)個(gè)Maven插件用下

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: Android應(yīng)用開(kāi)發(fā)簡(jiǎn)單幾步實(shí)現(xiàn)搖一搖功能

下一篇: 如何使用FluentResults優(yōu)雅地處理結(jié)果和錯(cuò)誤

標(biāo)簽:
  • 熱門(mén)焦點(diǎn)
  • 線程通訊的三種方法!通俗易懂

    線程通信是指多個(gè)線程之間通過(guò)某種機(jī)制進(jìn)行協(xié)調(diào)和交互,例如,線程等待和通知機(jī)制就是線程通訊的主要手段之一。 在 Java 中,線程等待和通知的實(shí)現(xiàn)手段有以下幾種方式:Object 類下
  • 自動(dòng)化在DevOps中的力量:簡(jiǎn)化軟件開(kāi)發(fā)和交付

    自動(dòng)化在DevOps中扮演著重要角色,它提升了DevOps的效能。通過(guò)自動(dòng)化工具和方法,DevOps團(tuán)隊(duì)可以實(shí)現(xiàn)以下目標(biāo):消除手動(dòng)和重復(fù)性任務(wù)。簡(jiǎn)化流程。在整個(gè)軟件開(kāi)發(fā)生命周期中實(shí)現(xiàn)更
  • 微軟邀請(qǐng) Microsoft 365 商業(yè)用戶,測(cè)試視頻編輯器 Clipchamp

    8 月 1 日消息,微軟近日宣布即將面向 Microsoft 365 商業(yè)用戶,開(kāi)放 Clipchamp 應(yīng)用,邀請(qǐng)用戶通過(guò)該應(yīng)用來(lái)編輯視頻。微軟于 2021 年收購(gòu) Clipchamp,隨后開(kāi)始逐步整合到 Microsof
  • Temu起訴SHEIN,跨境電商戰(zhàn)事升級(jí)

    來(lái)源 | 伯虎財(cái)經(jīng)(bohuFN)作者 | 陳平安日前據(jù)外媒報(bào)道,拼多多旗下跨境電商平臺(tái)Temu正對(duì)競(jìng)爭(zhēng)對(duì)手SHEIN提起新訴訟,訴狀稱Shein&ldquo;利用市場(chǎng)支配力量強(qiáng)迫服裝廠商與之簽訂獨(dú)家
  • 本地生活這塊肥肉,拼多多也想吃一口

    出品/壹覽商業(yè) 作者/李彥編輯/木魚(yú)拼多多也看上本地生活這塊蛋糕了。近期,拼多多在App首頁(yè)&ldquo;充值中心&rdquo;入口上線了本機(jī)生活界面。壹覽商業(yè)發(fā)現(xiàn),該界面目前主要
  • 一條抖音4億人圍觀 ! 這家MCN比無(wú)憂傳媒還野

    作者:Hiu 來(lái)源:互聯(lián)網(wǎng)品牌官01 擦邊少女空降熱搜,幕后推手曝光被網(wǎng)友譽(yù)為&ldquo;純欲天花板&rdquo;的女網(wǎng)紅井川里予,近期因?yàn)橐唤M哥特風(fēng)照片登上熱搜,引發(fā)了一場(chǎng)互聯(lián)網(wǎng)世界關(guān)于
  • 品牌洞察丨服務(wù)本地,美團(tuán)直播成效幾何?

    來(lái)源:17PR7月11日,美團(tuán)App首頁(yè)推薦位出現(xiàn)&ldquo;美團(tuán)直播&rdquo;的固定入口。在直播聚合頁(yè)面,外賣&ldquo;神槍手&rdquo;直播間、美團(tuán)旅行直播間、美團(tuán)買菜直播間等均已上線,同時(shí)
  • 小米MIX Fold 3配置細(xì)節(jié)曝光:搭載領(lǐng)先版驍龍8 Gen2+罕見(jiàn)5倍長(zhǎng)焦

    這段時(shí)間以來(lái),包括三星、一加、榮耀等等有不少品牌旗下的最新折疊屏旗艦都得到了不少爆料,而小米新一代折疊屏旗艦——小米MIX Fold 3此前也屢屢被傳
  • 北京:科技教育體驗(yàn)基地開(kāi)始登記

      北京“科技館之城”科技教育體驗(yàn)基地登記和認(rèn)證工作日前啟動(dòng)。首批北京科技教育體驗(yàn)基地?cái)M于2023年全國(guó)科普日期間掛牌,后續(xù)還將開(kāi)展常態(tài)化登記。  北京科技教育體驗(yàn)基
Top 主站蜘蛛池模板: 梓潼县| 芜湖县| 诏安县| 揭西县| 开远市| 洮南市| 桐庐县| 肥西县| 平湖市| 嘉义县| 和田市| 衡阳市| 青阳县| 金昌市| 阳山县| 榆树市| 得荣县| 长泰县| 五华县| 常山县| 新密市| 嘉黎县| 襄汾县| 繁昌县| 五华县| 正阳县| 衡南县| 泌阳县| 大余县| 垣曲县| 颍上县| 高邮市| 武川县| 乌鲁木齐县| 内江市| 阿尔山市| 竹溪县| 民和| 云阳县| 上虞市| 贵定县|