You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否使用Java Spark Framework生成可部署于Tomcat的标准WAR包?

当然可以!Java Spark Framework完全支持WAR包部署到Tomcat

我之前也做过类似的迁移,把Spark+j2html的应用打包成WAR放到Tomcat上跑,完全没问题,给你一步步说怎么做:

1. 改造Spark应用适配Servlet容器

Spark默认用内嵌服务器,要切换到Tomcat这类容器,得把应用改成Servlet模式:

  • 创建一个实现SparkApplication的初始化类,把原来的路由逻辑都移到init()方法里:
    import spark.servlet.SparkApplication;
    import spark.Spark;
    import static j2html.TagCreator.*;
    
    public class MySparkWebApp implements SparkApplication {
        @Override
        public void init() {
            // 这里放你的所有Spark路由和业务逻辑,比如:
            Spark.get("/", (req, res) -> {
                return html(
                    body(
                        h1("Hello from Spark on AWS Tomcat!"),
                        p("依然用j2html渲染UI,丝滑得很")
                    )
                ).render();
            });
        }
    }
    
  • 然后在src/main/webapp/WEB-INF下创建web.xml,配置Spark的过滤器来接管请求:
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
        <display-name>Spark Tomcat WAR App</display-name>
        <filter>
            <filter-name>SparkFilter</filter-name>
            <filter-class>spark.servlet.SparkFilter</filter-class>
            <init-param>
                <!-- 替换成你刚才创建的SparkApplication实现类的全路径 -->
                <param-name>applicationClass</param-name>
                <param-value>com.yourcompany.MySparkWebApp</param-value>
            </init-param>
        </filter>
        <filter-mapping>
            <filter-name>SparkFilter</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    </web-app>
    

2. 调整Maven依赖避免冲突

Tomcat自带Servlet API,所以要把Spark依赖里的Servlet API设为provided,不然会出现类冲突:

<dependencies>
    <dependency>
        <groupId>com.sparkjava</groupId>
        <artifactId>spark-core</artifactId>
        <version>2.9.4</version> <!-- 用你实际在用的版本 -->
    </dependency>
    <dependency>
        <groupId>com.j2html</groupId>
        <artifactId>j2html</artifactId>
        <version>1.6.0</version> <!-- 对应你的j2html版本 -->
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>4.0.1</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

再配置下Maven的WAR插件,确保打包正常:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>3.3.2</version>
            <configuration>
                <warName>spark-web-app</warName> <!-- 自定义WAR包名称 -->
            </configuration>
        </plugin>
    </plugins>
</build>

3. 打包&部署到AWS Tomcat

  • 跑mvn clean package,在target目录就能拿到生成的WAR包。
  • 把WAR包上传到AWS Tomcat的webapps目录,或者通过AWS控制台的部署功能上传,Tomcat会自动解压部署。

几个要注意的点

  • 版本兼容:Spark 2.x适配Servlet 3.0+,Tomcat 8.5及以上都支持,AWS上的Tomcat版本一般都满足。
  • 内嵌服务器配置失效:原来写的Spark.port()这类配置在Tomcat环境下没用,端口由Tomcat的配置决定。
  • j2html完全不受影响:它只是生成HTML字符串,不管部署方式,你可以继续用它构建UI,和之前一样顺手。

内容的提问来源于stack exchange,提问作者Paul Taylor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:47:31