最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Tomcat Maven插件部署與卸載的完整架構(gòu)設(shè)計

 更新時間:2026年02月10日 09:38:17   作者:lang20150928  
文章詳細(xì)介紹了Apache Tomcat Maven Plugin中的部署和卸載功能,通過多層抽象、組合復(fù)用和注解驅(qū)動的設(shè)計,實現(xiàn)了靈活、可配置的遠(yuǎn)程Tomcat操作,通過代碼展示了Apache Tomcat Maven Plugin(如 tomcat8-maven-plugin)中部署和卸載類目標(biāo)的設(shè)計體系,感興趣的朋友一起看看吧

這段代碼展示了 Apache Tomcat Maven Plugin(如 tomcat8-maven-plugin)中“部署”和“卸載”類目標(biāo)的完整設(shè)計體系。它通過多層抽象 + 組合復(fù)用 + 注解驅(qū)動的方式,實現(xiàn)了高度靈活、可配置、可擴(kuò)展的遠(yuǎn)程 Tomcat 操作能力。

我們來逐層拆解理解:

?? 整體結(jié)構(gòu)概覽

AbstractWarCatalinaMojo
  ↓
AbstractDeployMojo                 ← 定義部署邏輯(war / context / both)
  ↓
AbstractDeployWarMojo              ← 專用于 WAR 文件部署
  ↓
DeployMojo                         ← @Mojo(name = "deploy") —— 綁定到 package 階段
DeployOnlyMojo                     ← @Mojo(name = "deploy-only") —— 不綁定生命周期
  ↓
RedeployMojo                       ← 覆蓋 isUpdate() → true(自動 undeploy 再 deploy)
RedeployOnlyMojo                   ← 同上,但不綁定生命周期
UndeployMojo                       ← 獨立實現(xiàn),用于卸載應(yīng)用

? 所有目標(biāo)都繼承自 AbstractWarCatalinaMojo,因此天然支持:

  • 只處理 WAR 項目
  • 連接遠(yuǎn)程 Tomcat Manager
  • 多種認(rèn)證方式
  • 日志與錯誤處理

?? 核心類詳解

1??AbstractDeployMojo——部署策略的抽象基類

  • 核心功能:根據(jù) mode 參數(shù)決定部署方式:
    • war:只部署 WAR 文件(默認(rèn))
    • context:只部署 context.xml
    • both:同時部署 WAR + context.xml
@Override
    public void invokeManager()
        throws MojoExecutionException, TomcatManagerException, IOException
    {
        if ( "war".equals( mode ) )
        {
            deployWar();
        }
        else if ( "context".equals( mode ) )
        {
            deployContext();
        }
        else if ( "both".equals( mode ) )
        {
            deployWarAndContext();
        }
        else
        {
            throw new MojoExecutionException( messagesProvider.getMessage( "AbstractDeployMojo.unknownMode", mode ) );
        }
    }
	/**
     * Deploys the WAR to Tomcat.
     *
     * @throws org.apache.maven.plugin.MojoExecutionException
     *                             if there was a problem locating the WAR
     * @throws org.apache.tomcat.maven.common.deployer.TomcatManagerException
     *                             if the Tomcat manager request fails
     * @throws java.io.IOException if an i/o error occurs
     */
    protected void deployWar()
        throws MojoExecutionException, TomcatManagerException, IOException
    {
        validateWarFile();
        getLog().info( messagesProvider.getMessage( "AbstractDeployMojo.deployingWar", getDeployedURL() ) );
        URL warURL = getWarFile().toURL();
        log( getManager().deploy( getPath(), warURL, isUpdate(), getTag() ).getHttpResponseBody() );
    }
    /**
     * Deploys the context XML file to Tomcat.
     *
     * @throws org.apache.maven.plugin.MojoExecutionException
     *                             if there was a problem locating the context XML file
     * @throws org.apache.tomcat.maven.common.deployer.TomcatManagerException
     *                             if the Tomcat manager request fails
     * @throws java.io.IOException if an i/o error occurs
     */
    protected void deployContext()
        throws MojoExecutionException, TomcatManagerException, IOException
    {
        validateContextFile();
        getLog().info( messagesProvider.getMessage( "AbstractDeployMojo.deployingContext", getDeployedURL() ) );
        URL contextURL = getContextFile().toURL();
        log( getManager().deployContext( getPath(), contextURL, isUpdate(), getTag() ).getHttpResponseBody() );
    }
    /**
     * Deploys the WAR and context XML file to Tomcat.
     *
     * @throws org.apache.maven.plugin.MojoExecutionException
     *                             if there was a problem locating either the WAR or the context XML file
     * @throws org.apache.tomcat.maven.common.deployer.TomcatManagerException
     *                             if the Tomcat manager request fails
     * @throws java.io.IOException if an i/o error occurs
     */
    protected void deployWarAndContext()
        throws MojoExecutionException, TomcatManagerException, IOException
    {
        validateWarFile();
        validateContextFile();
        getLog().info( messagesProvider.getMessage( "AbstractDeployMojo.deployingWarContext", getDeployedURL() ) );
        URL warURL = getWarFile().toURL();
        URL contextURL = getContextFile().toURL();
        TomcatManagerResponse tomcatResponse = getManager().deployContext( getPath(), contextURL, warURL, isUpdate(), getTag() );
        checkTomcatResponse( tomcatResponse );
        log( tomcatResponse.getHttpResponseBody() );
    }

關(guān)鍵方法

protected abstract File getWarFile();      // 子類提供 WAR 路徑
protected abstract void validateWarFile(); // 子類校驗 WAR 是否存在
  • 參數(shù)
    • mode:部署模式
    • contextFile:上下文文件路徑(默認(rèn) ${project.build.directory}/.../META-INF/context.xml
    • update:是否先 undeploy 再 deploy(對應(yīng) Tomcat 的 ?update=true
    • tag:用于標(biāo)記部署版本(高級功能)

?? 它不關(guān)心 WAR 是文件還是目錄,把具體實現(xiàn)留給子類。

2??AbstractDeployWarMojo——WAR 文件部署的具體實現(xiàn)

覆蓋父類方法

@Override
protected File getWarFile() {
    return warFile; // 來自參數(shù),默認(rèn)是 target/${artifactId}.war
}
@Override
protected void validateWarFile() {
    if (!warFile.exists()) throw ...;
}
  • 優(yōu)化 deployWar()
  • 調(diào)用 getManager().deploy(..., warFile, ..., warFile.length())

顯式傳入文件大小 → 支持更高效的 HTTP 上傳(避免先讀入內(nèi)存)

/**
     * {@inheritDoc}
     */
    @Override
    protected void deployWar()
        throws MojoExecutionException, TomcatManagerException, IOException
    {
        validateWarFile();
        getLog().info( messagesProvider.getMessage( "AbstractDeployMojo.deployingWar", getDeployedURL() ) );
        TomcatManagerResponse tomcatManagerResponse =
            getManager().deploy( getPath(), warFile, isUpdate(), getTag(), warFile.length() );
        checkTomcatResponse( tomcatManagerResponse );
        getLog().info( "tomcatManager status code:" + tomcatManagerResponse.getStatusCode() + ", ReasonPhrase:"
                           + tomcatManagerResponse.getReasonPhrase() );
        log( tomcatManagerResponse.getHttpResponseBody() );
    }

? 這是 最常用 的部署方式:直接上傳一個 .war 文件到 Tomcat。

3??DeployMojovsDeployOnlyMojo——生命周期綁定差異

注解行為
DeployMojo@Execute(phase = LifecyclePhase.PACKAGE)執(zhí)行前自動觸發(fā) package 階段(確保 WAR 已生成)
DeployOnlyMojo@Execute不觸發(fā)任何生命周期,假定 WAR 已存在

使用場景:

# 自動打包并部署
mvn tomcat8:deploy
# 假設(shè) WAR 已存在,直接部署(CI/CD 中常用)
mvn tomcat8:deploy-only

?? @Execute 是 Maven 插件的“前置任務(wù)”機(jī)制。

4??RedeployMojo/RedeployOnlyMojo——便捷別名

核心 trick:重寫 isUpdate() 返回 true

@Override
protected boolean isUpdate() {
    return true; // 等價于 -Dmaven.tomcat.update=true
}

效果:Tomcat 會先 undeploy 同 path 的應(yīng)用,再 deploy 新的 → 避免“already exists”錯誤

? 用戶無需記參數(shù),直接用 redeploy 更直觀。

5??UndeployMojo——獨立卸載邏輯

簡單直接:調(diào)用 manager.undeploy(path)

容錯設(shè)計

if (failOnError) throw exception;
else log.warn("Failed to undeploy, but continuing...");

適用場景:清理環(huán)境、滾動部署前移除舊版本

?? 設(shè)計亮點總結(jié)

特性說明
分層抽象從“是否 WAR 項目” → “如何連接 Tomcat” → “部署什么” → “如何部署”,職責(zé)清晰
策略模式mode=war/context/both 允許不同部署策略
模板方法invokeManager() 調(diào)用子類實現(xiàn)的 deployXxx()
生命周期集成@Execute(phase = PACKAGE) 自動構(gòu)建 WAR
用戶友好提供 deploy / redeploy / deploy-only 等語義化目標(biāo)
安全容錯failOnError 控制卸載失敗是否中斷構(gòu)建

??? 實際使用示例

場景 1:標(biāo)準(zhǔn)部署(自動打包)

mvn tomcat8:deploy \
  -Dtomcat.username=admin \
  -Dtomcat.password=secret \
  -Dmaven.tomcat.url=http://prod-server:8080/manager/text

場景 2:重新部署(覆蓋已有應(yīng)用)

mvn tomcat8:redeploy
# 等價于 mvn tomcat8:deploy -Dmaven.tomcat.update=true

場景 3:僅卸載(不中斷構(gòu)建)

mvn tomcat8:undeploy -Dmaven.tomcat.failOnError=false

? 總結(jié)一句話

這套代碼通過“抽象基類 + 具體實現(xiàn) + 注解元數(shù)據(jù)”的組合,將 Tomcat 部署/卸載操作封裝成一組語義清晰、配置靈活、安全可靠的 Maven 目標(biāo)(goals),既滿足日常開發(fā)需求,也適配自動化部署場景。

它是 Maven 插件設(shè)計的最佳實踐范例:高內(nèi)聚、低耦合、易擴(kuò)展、用戶友好。

到此這篇關(guān)于Tomcat Maven插件部署與卸載的完整架構(gòu)設(shè)計的文章就介紹到這了,更多相關(guān)Tomcat Maven插件部署與卸載內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Nginx/Httpd負(fù)載均衡tomcat配置教程

    Nginx/Httpd負(fù)載均衡tomcat配置教程

    這篇文章主要介紹了Nginx/Httpd負(fù)載均衡tomcat配置方法,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • Windows下的Tomcat7安裝與環(huán)境配置教程

    Windows下的Tomcat7安裝與環(huán)境配置教程

    Tomcat安裝配置教程,涵蓋JDK安裝、Tomcat下載與解壓、環(huán)境變量配置及啟動驗證,助您快速搭建開發(fā)環(huán)境
    2026-05-05
  • Tomcat Maven插件部署與卸載的完整架構(gòu)設(shè)計

    Tomcat Maven插件部署與卸載的完整架構(gòu)設(shè)計

    文章詳細(xì)介紹了Apache Tomcat Maven Plugin中的部署和卸載功能,通過多層抽象、組合復(fù)用和注解驅(qū)動的設(shè)計,實現(xiàn)了靈活、可配置的遠(yuǎn)程Tomcat操作,通過代碼展示了Apache Tomcat Maven Plugin(如 tomcat8-maven-plugin)中部署和卸載類目標(biāo)的設(shè)計體系,感興趣的朋友一起看看吧
    2026-02-02
  • Tomcat打破雙親委派機(jī)制實現(xiàn)隔離Web應(yīng)用的方法

    Tomcat打破雙親委派機(jī)制實現(xiàn)隔離Web應(yīng)用的方法

    本文主要介紹了Tomcat打破雙親委派機(jī)制實現(xiàn)隔離Web應(yīng)用的方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • docker安裝Tomcat 404問題的解決方案

    docker安裝Tomcat 404問題的解決方案

    這篇文章主要介紹了docker安裝Tomcat 404問題的解決方案,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • 關(guān)于Keytool配置?Tomcat的HTTPS雙向認(rèn)證的問題

    關(guān)于Keytool配置?Tomcat的HTTPS雙向認(rèn)證的問題

    Keytool是一個Java數(shù)據(jù)證書的管理工具,?Keytool將密鑰(key)和證書(certificates)存在一個稱為keystore的文件中,這篇文章主要介紹了Keytool配置?Tomcat的HTTPS雙向認(rèn)證問題,需要的朋友可以參考下
    2022-06-06
  • tomcat在linux中修改日志路徑

    tomcat在linux中修改日志路徑

    這篇文章主要介紹了tomcat在linux中修改日志路徑,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • 一文搞懂如何部署啟動多個tomcat并移植項目

    一文搞懂如何部署啟動多個tomcat并移植項目

    本文給大家介紹部署啟動多個tomcat并移植項目的操作方法,本文給大家介紹的非常詳細(xì),包括修改配置文件的方法也給大家列舉出來了,具體內(nèi)容詳情跟隨小編一起看看吧
    2021-06-06
  • idea配置Tomcat Deployment添加時沒有Artifact的問題及解決

    idea配置Tomcat Deployment添加時沒有Artifact的問題及解決

    這篇文章主要介紹了idea配置Tomcat Deployment添加時沒有Artifact的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 詳解從源碼分析tomcat如何調(diào)用Servlet的初始化

    詳解從源碼分析tomcat如何調(diào)用Servlet的初始化

    這篇文章主要介紹了詳解從源碼分析tomcat如何調(diào)用Servlet的初始化,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04

最新評論

壤塘县| 嘉黎县| 博罗县| 辽中县| 仁布县| 金华市| 化德县| 淄博市| 贵州省| 营山县| 沅陵县| 稻城县| 麦盖提县| 福州市| 寻乌县| 郑州市| 文成县| 东港市| 甘德县| 手游| 收藏| 佛冈县| 景德镇市| 利津县| 盐山县| 庄浪县| 墨脱县| 肥东县| 翁牛特旗| 兰州市| 金堂县| 阿尔山市| 萨迦县| 新民市| 湘潭市| 清水县| 贵德县| 上思县| 巨鹿县| 峨边| 九龙坡区|