向Spring Boot嵌入式tomcat添加战争

时间:2019-05-13 14:14:35

标签: java spring spring-boot embedded-tomcat-7 openkm

我有一个spring-boot应用程序,该应用程序使用嵌入式tomcat Web服务器,并通过其SDK使用OpenKM

现在,我有一些集成测试,这些测试使用restassured lib进行REST调用并验证响应结构。我的想法是将OpenKM.war集成到此嵌入式tomcat中,并能够运行此测试,而无需在其他服务器上运行openkm应用程序。

这就是我使嵌入式tomcat读取和部署openkm.war的方式:

@Configuration
public class TomcatConfig {
    @Bean
    public ServletWebServerFactory servletContainer() {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
            @Override
            protected void postProcessContext(Context context) {
                SecurityConstraint securityConstraint = new SecurityConstraint();
                securityConstraint.setUserConstraint("CONFIDENTIAL");
                SecurityCollection collection = new SecurityCollection();
                collection.addPattern("/*");
                securityConstraint.addCollection(collection);
                context.addConstraint(securityConstraint);
            }

            @Override
            protected TomcatWebServer getTomcatWebServer(Tomcat tomcat) {
                new File(tomcat.getServer().getCatalinaBase(), "webapp").mkdirs();
                try {
                    tomcat.addWebapp("/okm", new ClassPathResource("webapp/openkm.war").getFile().toString());
                } catch (Exception ex) {
                    throw new IllegalStateException("Failed to add okm", ex);
                }
                return super.getTomcatWebServer(tomcat);
            }
        };

        tomcat.addAdditionalTomcatConnectors(redirectConnector());
        return tomcat;
    }

    private Connector redirectConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        connector.setPort(8080);
        connector.setSecure(false);
        connector.setRedirectPort(8443);
        return connector;
    }
}

与openkm随附的独立tomcat Web服务器相比,部署所需的时间更长,但是可以部署。

但是部署过程因以下原因而失败:

IOException parsing XML document from URL [file:/tmp/tomcat.2352216859213135410.8080/openkm.xml]; nested exception is java.io.FileNotFoundException: /tmp/tomcat.2352216859213135410.8080/openkm.xml (No such file or directory)

我在openkm.war文件旁边有这个文件(加上server.xml,context.xml),但似乎嵌入式tomcat对此一无所知。

所有这些文件都位于src/main/resources/webapp中。

那么,我想知道我缺少什么配置,或者是否还有其他更好的方法可以实现我想要的?

谢谢。

春季启动:2.1.2。发布

1 个答案:

答案 0 :(得分:0)

您可以尝试做类似的事情;

StandardContext ctx = (StandardContext) tomcat.addWebapp("/okm", new ClassPathResource("webapp/openkm.war").getFile().toString());
WebResourceRoot resources = new StandardRoot(ctx);
resources.addPreResources(new DirResourceSet(resources, "{target mount path}",
        new File("src/main/resources/webapp").getAbsolutePath(), "/"));
ctx.setResources(resources);

因此您可以在tomcat部署中将src/main/resources/webapp/文件夹安装在{target mount path}上。虽然我不确定这条路吗?您可以尝试使用"/",甚至可以尝试"/WEB-INF/"吗?我目前无法在本地进行测试,但我希望这会有所帮助。

如果您需要在雄猫的不同文件夹中放置不同的文件,也可以使用FileResourceSet挂载单个文件。