Java 如何使用嵌入式tomcat 9创建可执行JAR?

Java 如何使用嵌入式tomcat 9创建可执行JAR?,java,maven,tomcat9,Java,Maven,Tomcat9,有没有人尝试过使用Tomcat9构建一个可执行的war/jar插件 我试图这样做,但遇到: 我查看了源代码,并根据文档将Catalina.setConfig()更改为Catalina.setConfigFile()。执行此操作后,.extract目录仅为空: 使用extractDirectory:.extract populateWebAppWarPerContext warValue:ROOT.war | ROOT populateWebAppWarPerContext contextValu

有没有人尝试过使用Tomcat9构建一个可执行的war/jar插件

我试图这样做,但遇到:

我查看了源代码,并根据文档将Catalina.setConfig()更改为Catalina.setConfigFile()。执行此操作后,.extract目录仅为空:

使用extractDirectory:.extract populateWebAppWarPerContext warValue:ROOT.war | ROOT populateWebAppWarPerContext contextValue/warFileName:ROOT/ROOT.war webappWarPerContext条目 键/值:ROOT/ROOT.war展开到文件:。提取/webapps/ROOT.war 线程“main”java.lang中出现异常。异常:致命:不可能 创建目录:。提取/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 JAR有更好的方法吗?

对于那些寻找解决方案的人来说,检查插件的代码并进行一些更改以使其正常工作是相当直接的。即: 更新POM以将依赖项更改为Tomcat 9 修复通常由不推荐的方法引起的编译错误。可以找到这些方法的查找。例如:

-                container.setConfig( serverXml.getAbsolutePath() );
+                container.setConfigFile( serverXml.getAbsolutePath() );
。。。而且

-            staticContext.addServletMapping( "/", "staticContent" );
+            staticContext.addServletMappingDecoded( "/", "staticContent" );
还有一些其他问题,但通常不难解决。这样做之后,我更新了我的应用程序的pom以使用修改后的版本,并且能够生成一个Tomcat9ExecJAR


我很想听听其他人在这里做什么。我知道有些人正在通过一个
新的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("", "/")
学分:

tomcat.addWebapp("", "/")