这应该是一个简单的,但它还没有到目前为止。我一直在与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.html
和css/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
我需要做的其他事情吗?
答案 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
是打包静态资源的好地方。