Tomcat嵌入式和Webjars资源

问题描述

我们最近将嵌入式Java Web服务器从Jetty迁移到了tomcat。我们现在有一个最终代码,可以像这样在Java中运行tomcat:

        final var tomcat = new Tomcat();

        tomcat.setPort( 8080 );
        var connector = new Connector( "HTTP/1.1" );
        connector.addUpgradeProtocol( new Http2Protocol() );
        tomcat.setConnector( connector );

        final var rootFolder = getRootFolder();
        System.out.println(rootFolder);
        var webContentFolder = new File( rootFolder,"webpage" );
        if( !webContentFolder.exists() ){ // Running from target/classes
            webContentFolder = new File( rootFolder );
        }
        var context = (StandardContext) tomcat.addWebapp( "",webContentFolder.getAbsolutePath() );
        context.setParentClassLoader( Main.class.getClassLoader() );

        var jarScanner = (StandardJarScanner) context.getJarScanner();
        jarScanner.setScanAllDirectories( false );
        jarScanner.setScanAllFiles( false );
        jarScanner.setScanBootstrapClasspath( false );
        jarScanner.setScanClasspath( false );
        jarScanner.setScanManifest( false );

        // basic http request
        Tomcat.addServlet( context,"embedded",new HttpServlet() {
            @Override
            protected void service(HttpServletRequest req,HttpServletResponse resp)
                    throws IOException {

                Writer w = resp.getWriter();
                w.write( "Embedded Tomcat servlet.\n" );
                w.flush();
                w.close();
            }
        } );
        context.addServletMappingDecoded( "/embedded","embedded" );

        // basic websocket
        context.addApplicationListener( WebSocketContextListener.class.getName() );

        tomcat.start();
        tomcat.getServer().await();

在码头,可以像这样添加资源处理程序

public class WebjarsResourceHandler extends ResourceHandler {

    private static final Pattern CURRENT_VERSION_PATH_MATCHER = Pattern.compile( "/webjars/[^/]*/current/.*" );
    private static final Pattern PATH_PATTERN = Pattern.compile( "/webjars/([^/]*)/([^/]*)/(.*)" );

    @Override
    public Resource getResource(String path) {
        if( !path.startsWith( "/webjars/" ) ){
            return null;
        }

        if( CURRENT_VERSION_PATH_MATCHER.matcher( path ).matches() ){
            var jarNameMatcher = PATH_PATTERN.matcher( path );
            if( jarNameMatcher.find() ){
                var jarName = jarNameMatcher.group( 1 );
                var currentVersion = new WebJarassetLocator().getWebJars().get( jarName );

                path = "/webjars/" + jarName + "/" + currentVersion + "/" + jarNameMatcher.group( 3 );
            }
        }

        return Resource.newClassPathResource( "/meta-inf/resources" + path );
    }
}

并将其添加到服务器配置中:

        final var handlers = new HandlerList(
                new WebjarsResourceHandler(),resourceHandler,servletContextHandler
        );
        server.setHandler( handlers );

例如,这允许我们使用路径/webjars/bootstrap/...引用html文件中的资源。在添加maven依赖项的情况下:

<dependency>
    <groupId>org.webjars.npm</groupId>
    <artifactId>bootstrap</artifactId>
</dependency>

如何使用嵌入式tomcat服务器重现此内容

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...