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

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

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

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

Maven 插件實踐

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

今天通過一個具體的插件來熟悉在項目中的使用。J9L28資訊網(wǎng)——每日最新資訊28at.com

一般公司的項目結(jié)構(gòu)或者代碼結(jié)構(gòu)都是非常固定的,有一些框架針對這種固化的代碼結(jié)構(gòu)或約定的規(guī)范,在開發(fā)前會嚴(yán)格對項目進(jìn)行模塊劃分,對各個模塊的代碼結(jié)構(gòu)也會嚴(yán)格要求。那么我們則可以根據(jù)這種約定的規(guī)范,通過工具來自動化的生成代碼,從而減少開發(fā)人員的工作量。J9L28資訊網(wǎng)——每日最新資訊28at.com

示例項目

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

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三個子模塊,每個子模塊又包含了特定的代碼結(jié)構(gòu). 這個屬于我們約定的模塊劃分規(guī)則,那么基于這樣的規(guī)則,我們完全可以通過開發(fā)一個插件來自動生成這種約定結(jié)構(gòu)的空項目。J9L28資訊網(wǎng)——每日最新資訊28at.com

實現(xiàn)步驟

假設(shè)插件名稱為 `module-create-maven-plugin`,將來我們會通過該插件實現(xiàn)
項目模塊文件夾和一些通用文件的自動生成。插件大概配置如下:
<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ù)期要求,來設(shè)想插件的開發(fā)過程。J9L28資訊網(wǎng)——每日最新資訊28at.com

定義一個maven插件項目

創(chuàng)建一個maven插件項目,在pom.xml中添加如下配置:J9L28資訊網(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)建一個Mojo根據(jù)配置添加實現(xiàn)邏輯

goal的名字設(shè)計成modules,由于最終項目是基于maven構(gòu)建,所以會生成pom.xml,插件中的幾個參數(shù)就是為了生成pom而設(shè)計J9L28資訊網(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());                // 上級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輔助類結(jié)合freemaker框架,最后為各個模塊生成對應(yīng)的pom.xml文件;通過自定義的XmlUtils工具類結(jié)合JDK Documentation API,實現(xiàn)父級模塊中modules節(jié)點的添加子module;J9L28資訊網(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,并安裝到本地倉庫J9L28資訊網(wǎng)——每日最新資訊28at.com

mvn clean package

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

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

結(jié)束語

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

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

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

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

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

標(biāo)簽:
  • 熱門焦點
  • 服務(wù)存儲設(shè)計模式:Cache-Aside模式

    Cache-Aside模式一種常用的緩存方式,通常是把數(shù)據(jù)從主存儲加載到KV緩存中,加速后續(xù)的訪問。在存在重復(fù)度的場景,Cache-Aside可以提升服務(wù)性能,降低底層存儲的壓力,缺點是緩存和底
  • 從 Pulsar Client 的原理到它的監(jiān)控面板

    背景前段時間業(yè)務(wù)團(tuán)隊偶爾會碰到一些 Pulsar 使用的問題,比如消息阻塞不消費了、生產(chǎn)者消息發(fā)送緩慢等各種問題。雖然我們有個監(jiān)控頁面可以根據(jù) topic 維度查看他的發(fā)送狀態(tài),
  • 零售大模型“干中學(xué)”,攀爬數(shù)字化珠峰

    文/侯煜編輯/cc來源/華爾街科技眼對于絕大多數(shù)登山愛好者而言,攀爬珠穆朗瑪峰可謂終極目標(biāo)。攀登珠峰的商業(yè)路線有兩條,一是尼泊爾境內(nèi)的南坡路線,一是中國境內(nèi)的北坡路線。相
  • 拼多多APP上線本地生活入口,群雄逐鹿萬億市場

    Tech星球(微信ID:tech618)文 | 陳橋輝 Tech星球獨家獲悉,拼多多在其APP內(nèi)上線了&ldquo;本地生活&rdquo;入口,位置較深,位于首頁的&ldquo;充值中心&rdquo;內(nèi),目前主要售賣美食相關(guān)的
  • 騰訊VS網(wǎng)易,最卷游戲暑期檔,誰能笑到最后?

    作者:無銹缽來源:財經(jīng)無忌7月16日晚,上海1862時尚藝術(shù)中心。伴隨著幻象的精準(zhǔn)命中,碩大的熒幕之上,比分被定格在了14:12,被寄予厚望的EDG戰(zhàn)隊以絕對的優(yōu)勢戰(zhàn)勝了BLG戰(zhàn)隊,拿下了總決
  • 當(dāng)家的盒馬,加速謀生

    來源 | 價值星球Planet作者 | 歸去來自己&ldquo;當(dāng)家&rdquo;的盒馬,開始加速謀生了。據(jù)盒馬官微消息,盒馬計劃今年開放生鮮供應(yīng)鏈,將其生鮮商品送往食堂。目前,盒馬在上海已經(jīng)與
  • 消息稱小米汽車開始篩選交付中心:需至少120個車位

    IT之家 7 月 7 日消息,日前,有微博簡介為“汽車行業(yè)從業(yè)者、長三角一體化擁護(hù)者”的微博用戶 @長三角行健者 發(fā)文表示,據(jù)經(jīng)銷商集團(tuán)反饋,小米汽車目前
  • iQOO Neo8系列或定檔5月23日:首發(fā)天璣9200+ 安卓跑分王者

    去年10月,iQOO推出了iQOO Neo7系列機(jī)型,不僅搭載了天璣9000+,而且是同價位唯一一款天璣9000+直屏旗艦,一經(jīng)上市便受到了用戶的廣泛關(guān)注。在時隔半年后,
  • 最薄的14英寸游戲筆記本電腦 Alienware X14已可以購買

    2022年1月份在國際消費電子展(CES2022)上首次亮相的Alienware新品——Alienware X14現(xiàn)在已經(jīng)可以購買了,這款筆記本電腦被譽為世界上最薄的 14 英寸游戲筆
Top 主站蜘蛛池模板: 三台县| 杭锦旗| 乡宁县| 庄河市| 宁乡县| 清涧县| 元阳县| 潢川县| 微山县| 汽车| 汉中市| 鹤壁市| 土默特左旗| 江安县| 清流县| 合川市| 永吉县| 石屏县| 织金县| 江山市| 毕节市| 隆安县| 蒙自县| 仪征市| 芦山县| 宜昌市| 琼海市| 达州市| 浮梁县| 青岛市| 腾冲县| 通江县| 南汇区| 台东县| 西吉县| 崇阳县| 隆子县| 瑞昌市| 年辖:市辖区| 海口市| 武清区|