有人尝试过使用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)
我查看了源代码,并根据文档here将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 线程“主”中的异常java.lang.Exception:FATAL:不可能 在以下位置创建目录:.extract / webapps org.apache.tomcat.maven.runner.Tomcat7Runner.extract(Tomcat7Runner.java:586) 在 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?
答案 0 :(得分:1)
对于那些寻求解决方案的人来说,直接检查插件的代码并进行一些更改以使其正常工作是相当直接的。即: 更新POM以将依赖项更改为Tomcat 9 修复通常源自不推荐使用的方法的编译错误。您可以在here中找到有关这些方法的查询。例如:
- container.setConfig( serverXml.getAbsolutePath() );
+ container.setConfigFile( serverXml.getAbsolutePath() );
...和...
- staticContext.addServletMapping( "/", "staticContent" );
+ staticContext.addServletMappingDecoded( "/", "staticContent" );
还有其他一些,但通常不难解决。这样做之后,我将应用程序的pom更新为使用修改后的版本,并能够生成Tomcat 9 exec jar。
我很想听听其他人在这里做什么。我知道有些人正在通过new Tomcat()
实例以编程方式初始化Tomcat,但是很好奇还有其他现成的解决方案。谢谢
答案 1 :(得分:0)
对于未来的搜索,一种解决方案是使用 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("", "/")