如何创建带有嵌入式tomcat 9的可执行jar?

时间:2018-11-02 17:31:50

标签: java maven tomcat9

有人尝试过使用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?

2 个答案:

答案 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("", "/")

归功于: https://nkonev.name/post/101