[英]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.