我的服务器类包含以下代码段:
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资源文件夹中,第三个应该在我的类路径上平坦.在我的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
无论如何,当我尝试以下任何URL时,我总是得到404s:
http://localhost:8099 http://localhost:8099/ http://localhost:8099/index.html http://localhost:8099/static/css/base.css
还有什么我需要做的吗?
解决方法
在我的情况下,安装的文件系统将是静态内容所在的位置(不在jar文件中),我希望vertx从该位置提供服务,以便可以实时更新.所以,我通过在vertx启动时将JVM系统属性vertx.disableFileCPResolving设置为true,禁用了StaticHandler中的类路径解析.
然后将webroot文件夹放在启动jvm的目录下.在我的情况下,我使用的脚本保证jvm的cwd始终是< app-root> / bin,所以删除< app-root> / bin / webroot中的内容就足够了.如果您不能保证jvm将从哪里启动,那么可能会更严格,因为您可能需要将绝对路径传递给指向此固定位置的StaticHandler.webroot(),但我认为有一个公开的问题关于支持(见here).
如果将静态内容打包到一个jar中,那会更简单一点.您可以在jar中添加“webroot”作为资源,并将所有感兴趣的内容放在那里.在这种情况下,您不想禁用类路径解析,因此请将vertx.disableFileCPResolving设置为false,或者不将其设置为false.现在当您运行vertx时,将在jar文件中找到webroot,并将其内容解压缩到< cwd> /.vertx / .file-cache-< guid> (其中cwd是从哪里开始的jvm),并从那里提供内容.请注意,如果您打算对内容进行实时更新,这是不可行的,因为当vertx关闭时,该目录下的文件的任何更改都将丢失,因为vertx-web将删除该目录.在重新启动时,它将再次从jar资源中检索原始文件,并且更改将丢失.
无论如何,希望这有帮助.