【问题标题】:How to deploy a spark Java web app?如何部署 Spark Java Web 应用程序?
【发布时间】:2013-11-16 00:16:42
【问题描述】:

我使用 spark web 框架创建了一个 webapp,但我不知道如何部署这个 webapp。如果这是非常基本的,我很抱歉,但我是 spark 框架的新手,我找不到任何指导我如何部署 spark webapp 的文档。:

  • 如何独立部署 spark webapp
  • 如何构建 spark webapp(到 war 文件或此类文件)并使用 web 服务器(jetty 或 Tomcat)进行部署。

【问题讨论】:

    标签: java webserver spark-java


    【解决方案1】:

    您首先需要创建一个可以构建到 .war 文件中的常规 Java 项目(在 Eclipse 中,这将是一个动态 Web 项目)

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

    过滤器内文档中列出的参数值需要指向您定义路由的类。

    此外,之前在 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 项目一样构建战争并将其部署到您的服务器。

    【讨论】:

    • 如何过滤 Jetty 使其不被包含在 WAR 中?
    【解决方案2】:

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

    首先,为web.xml config 设置过滤选项:

    <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 Expression 作为路由器。):

    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 捆绑包不是我想到的,但我喜欢它!
      • 会嵌入码头服务器吗?
      【解决方案4】:

      1) 克隆这个 repo:https://github.com/simplesteph/ec2-masterclass-sampleapp

      2) 导航到项目 pom.xml 目录

      3) mvn 全新安装

      4) 转到目标文件夹

      5) java -jar ec2-masterclass-sample-app-1.0-jar-with-dependencies.jar

      6) 在浏览器中,导航到http://localhost:4567

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-02-14
        • 1970-01-01
        • 2023-03-27
        • 2012-01-20
        • 2017-04-02
        • 2019-07-24
        • 1970-01-01
        相关资源
        最近更新 更多