如何部署一个Spark Java Web应用程序?

18

我使用Spark Web框架创建了一个Web应用程序,但不知道如何部署这个Web应用程序。很抱歉如果这很基础,但我是新手,找不到任何指导我如何部署Spark Web应用程序的文件。

  • 如何独立部署Spark Web应用程序
  • 如何构建Spark Web应用程序(到war文件或类似文件)并与Web服务器(jetty或Tomcat)一起部署。
4个回答

17

首先需要创建一个普通的Java项目,可以构建成.war文件(在Eclipse中,这将是一个动态Web项目)。

此链接中的Spark文档描述了需要添加到项目web.xml文件中的内容:http://sparkjava.com/documentation.html#other-webserver

文档中列出的filter内的param-value需要指向您定义路由的类所在的位置。

另外,之前在main()中的所有代码都需要移动到init()方法中。

@Override
public void init() {
    get(new Route("/test") {
        @Override
        public Object handle(Request request, Response response) {
            return "response goes here;
        }

    });

此外,为了使其能够在 JBoss 上部署,我只需包含 Spark 库而不是 Jetty 库。完成后,您可以像部署其他 Java 项目一样构建 war 文件并将其部署到服务器上。


你如何将Jetty从WAR包中排除掉? - voddan

8

在这里,您可以找到有关部署的信息: http://sparkjava.com/documentation.html#embedded-web-server

首先,在web.xml配置中设置过滤器选项:

<web-app>
  <!-- some options -->
  <filter>
    <filter-name>SparkFilter</filter-name>
    <filter-class>spark.servlet.SparkFilter</filter-class>
    <init-param>
      <param-name>applicationClass</param-name>
      <param-value>your.package.Application</param-value>
    </init-param>
  </filter>

  <filter-mapping>
    <filter-name>SparkFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

Application类应该实现接口spark.servlet.SparkApplication,并在init()方法中初始化路由。

这个看起来像是(在Java SE 8中,您可以使用Lambda表达式作为路由器。):

package your.package;

import static spark.Spark.*;

public class Application implements SparkApplication {
    @Override
    public void init() {
        get("/", (request, response) -> "Hello World");

        get("/hello/:name", (request, response) -> {
            return "Hello: " + request.params(":name");
        });
    }
}

这种配置的应用程序在 tomcatglassfish 服务器上都可以良好运行。


3
对于独立场景,您只需使用Gradle(或Maven)创建fat(意味着具有所有依赖项,包括嵌入式Jetty服务器)可执行jar文件。以下是一个简单的build.gradle文件,可以完成此操作:
apply plugin: 'java'
apply plugin: 'application'

// TODO Change this to your class with your main method
mainClassName = "my.app.Main"

defaultTasks 'run'

repositories {
    mavenCentral()
}

dependencies {
    compile group: 'com.sparkjava', name: 'spark-core', version: '2.5.5'
    // TODO add more dependencies here...
}

// Create a fat executable jar
jar {
    manifest {
        attributes "Main-Class": "$mainClassName"
    }

    from {
        configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
    }

    archiveName "app.jar"
}

通过命令行使用gradle build构建您的应用程序。这将在build/libs文件夹中创建一个app.jar文件,然后只需运行:

java -jar build/libs/app.jar

如果您想保持最新状态 :),那么您需要使用Docker来打包JRE和应用程序jar,这样您就不会依赖于服务器上安装的软件堆栈。为此,我们可以使用Dockerfile
FROM java:8

ADD build/libs/app.jar /

EXPOSE 4567
ENTRYPOINT ["java", "-jar", "app.jar"]

构建 Docker 镜像并运行,例如:
docker build -t myapp:v1 .
docker run --rm --name myapp -p 4567:4567 myapp:v1

当然,如果你想在远程 Web 服务器上使用 Docker 镜像,你需要将其推送到 Docker Hub 或私有的 Docker 仓库,并使用 docker pull 命令将其拉取到服务器上,然后再运行它。

Docker捆绑包不是我首先想到的,但我喜欢它! - Hatem Jaber
那个会嵌入Jetty服务器吗? - Xhark

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接