如何解决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 举报,一经查实,本站将立刻删除。