web-dev-qa-db-ja.com

Vertx-web:webrootフォルダーはどこに配置しますか?

これは簡単なはずですが、今のところそうではありません。しばらく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も使用しています。私は3つのwebrootフォルダーを持っていますが、vert.xはそれらをどれも見つけることができません。

myproject/webroot
myproject/src/main/resources/webroot
myproject/src/main/Java/webroot

これらの「webroot」のそれぞれには、index.htmlおよびcss/base.cssファイルが含まれています。

1つ目は、プロジェクトのルートフォルダーにあります。 2つ目はMavenリソースフォルダー内にあり、3つ目は私のclasspathでフラットになっているはずです。私のEclipse実行構成で、myproject/src/main/resources/webrootをクラスパスに追加し、作業ディレクトリが「私のプロジェクト'。コマンドラインから実行すると、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

他に何かしなければならないことはありますか?

15
Dave Taubler

私が見つけた解決策は、質問に対する回答によって異なります。静的コンテンツは実行時にどこにあり、どこからvertxに提供しますか?

私の場合、インストールされたファイルシステムは静的コンテンツが(jarファイルではなく)配置された場所にあり、vertxがその場所から提供して、ライブで更新できるようにしました。そこで、vertxの起動時にJVMシステムプロパティvertx.disableFileCPResolvingtrueに設定することで、StaticHandlerでのクラスパス解決を無効にしました。

次に、webrootフォルダーを、jvmを起動するディレクトリの下に配置しました。私の場合、jvmのcwdが常に<app-root>/binであることを保証するスクリプトを使用しているため、<app-root>/bin/webrootにコンテンツをドロップするだけで十分でした。 jvmがどこから開始されるかを保証できない場合は、この固定された場所を指すStaticHandler.webroot()への絶対パスを渡す必要があるため、より難しいかもしれませんが、未解決の問題があると思いますこれのサポートに関して( ここ を参照)。

静的コンテンツをjarにパッケージ化する場合は、少し簡単です。 jarに「webroot」をリソースとして追加し、関心のあるすべてのコンテンツをそこに配置できます。この場合、クラスパス解決を無効にしたくないので、vertx.disableFileCPResolvingfalseに設定するか、まったく設定しないでください。 vertxを実行すると、jarファイルでwebrootが見つかり、その内容が<cwd>/.vertx/.file-cache-<guid>に抽出されます(cwdは、jvmを開始した場所です) 、そこからコンテンツを提供します。 vertx-webがそのディレクトリを削除するため、vertxがシャットダウンすると、そのディレクトリの下のファイルへの変更はすべて失われるため、コンテンツをライブ更新できる場合は、これは実行できないことに注意してください。再起動すると、jarリソースから元のファイルが再度取得され、変更は失われます。

とにかく、これが役に立てば幸いです。

7
Hoobajoob

ブレークポイントで次のコードを実行すると、リソースリクエストを解決するルートディレクトリがわかります。

new File("").getCanonicalPath()

リクエスト:localhost:8080/static/script.js

ハンドラ:

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

ファイルはMODULE_ROOT/webroot/script.jsにある必要があります

StaticHandlerImpl#sendStaticメソッドまでデバッグしてファイルがどのように解決されているかを確認し、デバッグ式ウィンドウを自由に使用してファイルシステムに問い合わせます。

6
geg

デフォルトのクラスパス設定でうまくいきました。次の階層を使用しました。

静的ファイルを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);

これで、次のURLからアクセスできます:http://localhost:8080/static/

詳細は vertx-webのドキュメント を参照してください。

5
devsathish

了解しました。私自身の質問にいくらかお答えします。最初に、vertx-web docsの静的コンテンツ部分をキーオフしていたことを指摘する必要があります( 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();
});
3
Dave Taubler

このソリューションは私にとってうまくいきました、ここに詳細を追加するために私のためのフォルダー構造があります

src
    main
        Java
            com
                -- Java files with vertx
        resources
            webroot
                html
                js
2

ディレクトリ

<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
1
Anders B

/ src/main/resources/assets /に保存されている静的ファイル

例:index.html

_Router router = Router.router(vertx);
router.route("/files/*").handler(StaticHandler.create("assets"));
vertx.createHttpServer().requestHandler(router::accept).listen(8080);
_

http:// localhost:8080/files/index.html からアクセスできます

router.route("/files/*").handler(StaticHandler.create("assets"));を見ると

リクエストが_/files/_に一致すると、assetsフォルダーを_web-root_として指定するStaticHandlerを呼び出します

1
niro

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は、パッケージ化された静的リソースに適した場所です。

0
kva1966