簡體   English   中英

如何使用嵌入式 tomcat 9 創建可執行 jars?

[英]How can I create executable jars with embedded tomcat 9?

有沒有人嘗試過使用 Tomcat 9 構建一個可執行的 war/jar 插件?

我試圖這樣做但是遇到了:

 Exception in thread "main" java.lang.NoSuchMethodError: org.apache.catalina.startup.Catalina.setConfig(Ljava/lang/String;)V at org.apache.tomcat.maven.runner.Tomcat7Runner.run(Tomcat7Runner.java:240) at org.apache.tomcat.maven.runner.Tomcat7RunnerCli.main(Tomcat7RunnerCli.java:204)

我查看了源代碼並根據此處的文檔將 Catalina.setConfig() 更改為 Catalina.setConfigFile() 。 這樣做之后 .extract 目錄是空的:

使用extractDirectory:.extract populateWebAppWarPerContext warValue:ROOT.war|ROOT populateWebAppWarPerContext contextValue/warFileName:ROOT/ROOT.war webappWarPerContext 條目鍵/值:ROOT/ROOT.war 擴展到文件:.extract/webapps/ROOT.war 線程中的異常“ main" java.lang.Exception: 致命:無法在 org.apache.tomcat.maven.runner.Tomcat7Runner.extract(Tomcat7Runner.java:586) 上創建目錄:.extract/webapps 在 org.apache.tomcat.maven.runner .Tomcat7Runner.run(Tomcat7Runner.java:204) 在 org.apache.tomcat.maven.runner.Tomcat7RunnerCli.main(Tomcat7RunnerCli.java:204)

....雖然在*-exec-war.jar中有ROOT.war、server.xml、web.xml。

有沒有更好的方法來創建帶有嵌入式 tomcat 9 的 exec-jars?

對於那些正在尋找解決方案的人來說,檢查插件的代碼並進行一些更改以使其正常工作是相當直接的。 即:更新 POM 以將依賴項更改為 Tomcat 9 修復通常源於已棄用方法的編譯錯誤。 可以在此處找到對這些方法的查找。 例如:

-                container.setConfig( serverXml.getAbsolutePath() );
+                container.setConfigFile( serverXml.getAbsolutePath() );

... 和 ...

-            staticContext.addServletMapping( "/", "staticContent" );
+            staticContext.addServletMappingDecoded( "/", "staticContent" );

還有一些其他的,但通常不難解決。 這樣做之后,我更新了我的應用程序的 pom 以使用修改后的版本,並且能夠生成一個 Tomcat 9 exec jar。

我很想聽聽其他人在這里做什么。 我知道有些人正在通過一個new Tomcat()實例以編程方式初始化 Tomcat,但很好奇還有哪些現成的解決方案。 謝謝

對於將來的搜索,一種解決方案是使用 DirResourceSet 或 JarResourceSet。

    String webAppMount = "/WEB-INF/classes";
    WebResourceSet webResourceSet;
    if (!isJar()) {
        webResourceSet = new DirResourceSet(webResourceRoot, webAppMount, getResourceFromFs(), "/");
    } else {
        webResourceSet = new JarResourceSet(webResourceRoot, webAppMount, getResourceFromJarFile(), "/");
    }
    webResourceRoot.addJarResources(webResourceSet);
    context.setResources(webResourceRoot);


public static boolean isJar() {
    URL resource = Main.class.getResource("/");
    return resource == null;
}

public static String getResourceFromJarFile() {
    File jarFile = new File(System.getProperty("java.class.path"));
    return jarFile.getAbsolutePath();
}

public static String getResourceFromFs() {
    URL resource = Main.class.getResource("/");
    return resource.getFile();
}

添加 webapp 時,為 docBase 使用根路徑“/”:

tomcat.addWebapp("", "/")

學分: https : //nkonev.name/post/101

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM