今天在修一个老项目,使用的是jfinal框架,这个框架算是一个比较传统的框架,只支持打包成war运行放入容器中运行,但是在开发过程中可以使用jetty快速启动和调试。个人不是很喜欢jetty,遂换成了undertow。 引入如下依赖
<dependency>
<groupId>io.undertow</groupId>
<artifactId>undertow-core</artifactId>
<version>2.0.1.Final</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>io.undertow</groupId>
<artifactId>undertow-servlet</artifactId>
<version>2.0.1.Final</version>
<scope>provided</scope>
</dependency>
再写一个启动类就好了
public class Main {
public static void main(String[] args) throws Exception {
DeploymentInfo servletBuilder = Servlets.deployment()
.setContextPath("/")
.setClassLoader(Main.class.getClassLoader())
.setDeploymentName("zooadmin.war")
;
FilterInfo jfinalFilter=new FilterInfo("jfinal",JFinalFilter.class);
jfinalFilter.addInitParam("configClass","com.baicai.core.Config");
servletBuilder.addFilter(jfinalFilter);
servletBuilder.addFilterUrlMapping("jfinal","/*", DispatcherType.REQUEST);
servletBuilder.addFilterUrlMapping("jfinal","/*", DispatcherType.FORWARD);
servletBuilder.setResourceManager(new FileResourceManager(new File("src/main/webapp"), 1024));
DeploymentManager manager = Servlets.defaultContainer().addDeployment(servletBuilder);
manager.deploy();
PathHandler path = Handlers.path(Handlers.redirect("/"))
.addPrefixPath("/", manager.start());
Undertow server = Undertow.builder()
.addHttpListener(1080, "localhost")
.setHandler(path)
.build();
// start server
server.start();
}
}
直接在这个类上运行main方法即可。关键的地方就是把传统的web项目的web.xml翻译成Java代码而已。 本来想继续实现springboot那种fatjar的打包方式,最后发现现有的maven插件都无法满足需求,spring是自己扩展了jar的一套协议实现的,实现起来颇有难度。留待以后折腾吧