Vertx-web:我在哪里放置webroot文件夹?

时间:2015-08-03 03:23:11

标签: java vert.x

这应该是一个简单的,但它还没有到目前为止。我一直在与vert.x 2合作,最近切换到vert.x 3。我以为我会尝试一个简单的vertx-web示例,但无法通过简单的静态文件提供。

我的服务器类包含以下代码段:

    HttpServer server = vertx.createHttpServer();
    Router router = ...;
    router.route("/static/*").handler(StaticHandler.create().setCachingEnabled(false));
    server.requestHandler(router::accept).listen(ctx.port);

我正在使用Eclipse,但也一直在尝试从命令行运行vertx。我也在使用Maven。我有三个webroot文件夹,vert.x找不到任何一个:

myproject/webroot
myproject/src/main/resources/webroot
myproject/src/main/java/webroot

每个'webroot'都包含index.htmlcss/base.css文件。

第一个是在我项目的根文件夹中。第二个是在Maven资源文件夹中,第三个应该是我的classpath。在我的Eclipse运行配置中,我将 myproject / src / main / resources / webroot 添加到类路径中,并确保我的工作目录设置为“myproject”。从命令行运行时,我在 myproject 目录中,我的脚本如下所示:

JAVA_OPTS="-Dmyproject.port=8099" CLASSPATH="src/main/java:src/main/resources:target/dependencies/*:target/classes" vertx run com.my.MyProject

无论如何,当我尝试这些网址时,我总是得到 404s

http://localhost:8099
http://localhost:8099/
http://localhost:8099/index.html
http://localhost:8099/static/css/base.css

我需要做的其他事情吗?

8 个答案:

答案 0 :(得分:7)

我找到的解决方案取决于问题的答案:静态内容将在运行时在哪里,以及您希望vertx在哪里提供服务?

在我的情况下,安装的文件系统将是静态内容所在的位置(不在jar文件中),我希望vertx从该位置提供服务,以便可以实时更新。因此,我通过在vertx启动时将JVM系统属性vertx.disableFileCPResolving设置为true来禁用StaticHandler中的类路径解析。

然后我将webroot文件夹放在启动jvm的目录下。在我的情况下,我使用的脚本可以保证jvm的cwd始终为<app-root>/bin,因此删除<app-root>/bin/webroot中的内容就足够了。如果你不能保证jvm从哪里开始,那么它可能会更难,因为你可能需要传递一个指向这个固定位置的StaticHandler.webroot()的绝对路径,但我认为有一个关于支持此问题的公开问题(见here)。

如果将静态内容打包到罐子里,它会更简单一些。您可以添加&#39; webroot&#39;作为jar中的资源并将所有感兴趣的内容放在那里。在这种情况下,您不想禁用类路径解析,因此要么将vertx.disableFileCPResolving设置为false,要么根本不设置它。现在,当您运行vertx时,它会在jar文件中找到webroot并将其内容提取到<cwd>/.vertx/.file-cache-<guid>(其中cwd是您从哪里启动jvm),并提供服务从那里的内容。请注意,如果您打算能够对内容进行实时更新,这是不可行的,因为当vertx关闭时,该目录下的文件的任何更改都将丢失,因为vertx-web将删除该目录。重新启动时,它将再次从jar资源中检索原始文件,并且更改将丢失。

无论如何,希望这有帮助。

答案 1 :(得分:5)

默认的类路径设置对我有用。我使用了以下层次结构:

将静态文件保存在main/resources/webroot目录

<AppRoot>/src/main/resources/webroot/static/index.html

并按如下方式初始化vertx:

import io.vertx.core.Vertx;
import io.vertx.core.http.HttpServer;
import io.vertx.ext.web.Router;
import io.vertx.ext.web.handler.StaticHandler;

Vertx vertx = Vertx.vertx();

Router router = Router.router(vertx);
router.route().handler(StaticHandler.create());

vertx.createHttpServer().requestHandler(router::accept).listen(8080);

现在您可以通过以下网址访问它:http://localhost:8080/static/

有关详细信息,请参阅vertx-web documentation

答案 2 :(得分:5)

在任何断点处执行以下代码,它会告诉您解析资源请求的根目录:

new File("").getCanonicalPath()

请求: localhost:8080 / static / script.js

处理程序:

router.route("/static/*").handler(StaticHandler.create("webroot"));

该文件应位于MODULE_ROOT/webroot/script.js

一直调试到StaticHandlerImpl#sendStatic方法以查看文件的解析方式,并使用调试表达式窗口来查询文件系统。

答案 3 :(得分:3)

好吧,我会回答一下我自己的问题。首先,我应该指出,我正在关注vertx-web文档(http://vertx.io/docs/vertx-web/js/#_serving_static_resources)的静态内容部分:

  

对静态处理程序处理的路径的任何请求都将导致   从文件系统上的目录或从文件系统中的目录提供的文件   类路径。默认的静态文件目录是webroot,但这可以   配置。

     

在以下示例中,对以/ static /开头的路径的所有请求   将从webroot目录中获取:

var StaticHandler = require("vertx-web-js/static_handler");

router.route("/static/*").handler(StaticHandler.create().handle);

  

对根路径的任何请求都将导致索引页面   提供服务。默认情况下,索引页面是index.html。这可以   使用setIndexPage配置。

在我看来,如果我没有明确定义“/”的处理程序,那么将隐式地提供index.html。而且似乎只需创建一个StaticHandler并将其添加到路由器就足够了CSS / JS / IMG资源。我认为我的假设是不正确的。

所以我添加了以下内容,这似乎是需要的:

首先,我明确告诉StaticHandler查找“webroot”文件夹:

router.route("/static/*").handler(StaticHandler.create("webroot").setCachingEnabled(false));

然后,我明确地向路由器添加了一条路由来处理对“/”的请求:

router.route("/").handler(ctx -> {
        Logger.log("Got an HTTP request to /");
        ctx.response().sendFile("webroot/index.html").end();
});

答案 4 :(得分:2)

这个解决方案对我有用,在这里添加更多细节是我的文件夹结构

src
    main
        java
            com
                -- java files with vertx
        resources
            webroot
                html
                js

答案 5 :(得分:1)

静态文件保存在/ src / main / resources / assets /

ex:index.html

#normal-nav {
    top: 64px;
    position: relative;
}

现在您可以从http://localhost:8080/files/index.html

访问它

如果你看Router router = Router.router(vertx); router.route("/files/*").handler(StaticHandler.create("assets")); vertx.createHttpServer().requestHandler(router::accept).listen(8080);

当请求与router.route("/files/*").handler(StaticHandler.create("assets"));匹配时,它会调用StaticHandler,将/files/文件夹指定为assets

答案 6 :(得分:1)

目录

<AppRoot>/webroot/index.html

Vertx

router.route("/app/*").handler(StaticHandler.create("webroot").setCachingEnabled(false));

URL

http://127.0.0.1/app/index.html

添加以下Java VM选项以启用热重新加载

-Dvertx.disableFileCPResolving=true

答案 7 :(得分:0)

我相信人们会因为在http://vertx.io/docs/vertx-web/kotlin/#_serving_static_resources提供静态资源的文档中的示例而惹恼 - 有些答案甚至可以改变路径路径,这不是所希望的!

我已经提出了https://github.com/vert-x3/issues/issues/265的详细信息。

其中,OP尝试过:

http://localhost:8099/static/css/base.css

这应该有效,其余路径无效,src/main/resources/webroot是打包静态资源的好地方。