基於嵌入式Tomcat的War包啓動器

前言

最近針對java項目的部署方式進行整理,jenkins/tomcat/windows工具/linux腳本/web部署平臺等等

發現war包通過tomcat部署比較繁瑣,等待時間長,配置規則複雜對於小白很不友好,也難以接入到自定義的部署工具/平臺中

之前開發的Jar包部署平臺是servlet開發通過嵌入式tomcat部署,藉此打開思路

能否基於嵌入式tomcat做一個war包啓動器,通過代碼的方式開啓tomcat容器來部署war包

源碼地址:https://gitee.com/code2roc/jar-manage/tree/master/waragent

藉此啓動器可以將war包部署集成到自己的工具平臺中,將啓動器的jar包按普通方式部署即可

方案

tomcat啓動一般需要幾個基本參數設置

  • war包路徑
  • 端口
  • 映射路由
Tomcat tomcat = new Tomcat();
tomcat.setPort(port);
StandardContext ctx = (StandardContext) tomcat.
addWebapp(contextPath, catalinaBase + File.separator + "webapps" + File.separator + name + ".war");

tomcat9啓動還需要指定cookie處理策略,否則無法識別

CookieProcessor cookieProcessor = new LegacyCookieProcessor();
ctx.setCookieProcessor(cookieProcessor);

後續實際使用中還涉及到了啓動jvm參數設置及jar包掃描跳過的配置

tomcat.getEngine().setJvmRoute(jvmStartCommand);
StandardJarScanner jarScanner = new StandardJarScanner();
StandardJarScanFilter jarScanFilter = new StandardJarScanFilter();
jarScanFilter.setTldSkip(skipScan);
jarScanFilter.setPluggabilitySkip(skipScan);
jarScanner.setJarScanFilter(jarScanFilter);
ctx.setJarScanner(jarScanner)

打包

原來預想把maven項目打到一個jar包方便調用,但是打包插件會把依賴jar包中的class文件進行合併

嵌入式tomcat依賴的jar包有相同包名的,導致class文件覆蓋,websocket相關內容報錯

所以把依賴jar包打入到同級lib文件夾中,和waranaget.jar一起拷貝使用

 <build>
        <finalName>${artifactId}</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                            <mainClass>com.code2roc.waragent.Application</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
            <!-- 拷貝依賴的jar包到lib目錄 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>
                                ${project.build.directory}/lib
                            </outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

使用

java -jar waragent.jar "啓動參數"

啓動參數一定要用雙引號包含,這樣才能正確解析

定義:"$appname★$warFilePath★$port★$contextPath★$jvmParam★$skipScan"

示例:"testwar★D:\testwar.war★9091★/testwar★-Xms3072m -Xmx3072m -Djava.awt.headless=true★xxx*.jar"

內部使用★分開,一共6個參數,最後一個參數可省略,其餘必填

  • 參數1:應用名稱
  • 參數2:war包絕對路徑
  • 參數3:端口號
  • 參數4:映射路由(contextPath)
  • 參數5:jvm啓動參數,主要指定內存大小
  • 參數6:啓動掃描跳過jar包名稱,多個使用,分開
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章