これは簡単なはずですが、今のところそうではありません。しばらく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
他に何かしなければならないことはありますか?
私が見つけた解決策は、質問に対する回答によって異なります。静的コンテンツは実行時にどこにあり、どこからvertxに提供しますか?
私の場合、インストールされたファイルシステムは静的コンテンツが(jarファイルではなく)配置された場所にあり、vertxがその場所から提供して、ライブで更新できるようにしました。そこで、vertxの起動時にJVMシステムプロパティvertx.disableFileCPResolving
をtrue
に設定することで、StaticHandlerでのクラスパス解決を無効にしました。
次に、webroot
フォルダーを、jvmを起動するディレクトリの下に配置しました。私の場合、jvmのcwd
が常に<app-root>/bin
であることを保証するスクリプトを使用しているため、<app-root>/bin/webroot
にコンテンツをドロップするだけで十分でした。 jvmがどこから開始されるかを保証できない場合は、この固定された場所を指すStaticHandler.webroot()への絶対パスを渡す必要があるため、より難しいかもしれませんが、未解決の問題があると思いますこれのサポートに関して( ここ を参照)。
静的コンテンツをjarにパッケージ化する場合は、少し簡単です。 jarに「webroot」をリソースとして追加し、関心のあるすべてのコンテンツをそこに配置できます。この場合、クラスパス解決を無効にしたくないので、vertx.disableFileCPResolving
をfalse
に設定するか、まったく設定しないでください。 vertx
を実行すると、jarファイルでwebroot
が見つかり、その内容が<cwd>/.vertx/.file-cache-<guid>
に抽出されます(cwd
は、jvmを開始した場所です) 、そこからコンテンツを提供します。 vertx-web
がそのディレクトリを削除するため、vertxがシャットダウンすると、そのディレクトリの下のファイルへの変更はすべて失われるため、コンテンツをライブ更新できる場合は、これは実行できないことに注意してください。再起動すると、jarリソースから元のファイルが再度取得され、変更は失われます。
とにかく、これが役に立てば幸いです。
ブレークポイントで次のコードを実行すると、リソースリクエストを解決するルートディレクトリがわかります。
new File("").getCanonicalPath()
リクエスト:localhost:8080/static/script.js
ハンドラ:
router.route("/static/*").handler(StaticHandler.create("webroot"));
ファイルはMODULE_ROOT/webroot/script.js
にある必要があります
StaticHandlerImpl#sendStatic
メソッドまでデバッグしてファイルがどのように解決されているかを確認し、デバッグ式ウィンドウを自由に使用してファイルシステムに問い合わせます。
デフォルトのクラスパス設定でうまくいきました。次の階層を使用しました。
静的ファイルを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のドキュメント を参照してください。
了解しました。私自身の質問にいくらかお答えします。最初に、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();
});
このソリューションは私にとってうまくいきました、ここに詳細を追加するために私のためのフォルダー構造があります
src
main
Java
com
-- Java files with vertx
resources
webroot
html
js
ディレクトリ
<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
/ 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を呼び出します
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
は、パッケージ化された静的リソースに適した場所です。