質問: getClass().getResource("/application/webView.css"); System.out.println((new StringBuilder("url ")).append(url).toString()); System.out.println((new StringBuilder("url ")).append(url.toExternalForm()).toString()); webEngine.setUserStyleSheetLocation(url.toExternalForm()); ``` それだと、デコンパイル時に変換が起こっているか、コード以外の部分が原因と考えられそうですが。 深い森に入り込んだような感じです。
回答: 原因についてわからないのですが参考になるかも知れない点をコメントしてみます。 スタックトレースからJDKのソース(1.8.0_131)を当たってみると、指定されたURLが期待通りの形式でなかった場合に550行目で例外が起きるので、それが直接原因に見えました。ソースコードを見る限りuserStyleSheetLocationプロパティーに指定できるのは * null * "" * "data:text/css;charset=utf-8;base64,"で始まるもの * "file:", "jar:", "data:"で始まるもの となっており、いずれでもない場合に550行目で"Invalid stylesheet URL"がスローされます。ただ・・・ご質問のコードでのURLの求め方はIDE上で動かしてもjarから動かしてもどちらでも通用する書き方であると思います。実際、自分もやってみましたがどちらでも動きます。 jarから動かすと指定されるURLは以下のようなものになってます(IntelliJ IDEAなのでEclipseでの様子とは異なると思います) jar:file:/C:/IdeaProject/TestApp/out/artifacts/TestApp/TestApp.jar!/application/webView.css 切り分けのために、userStyleSheetLocationに設定しようとしている文字列の内容をデバッグプリントしてみてはいかがでしょうか。 追記1: 以前のご質問の内容・時期からお使いのJDKは1.8.0_131と推測しましたが、合ってるでしょうか? =>JDKのバージョンが微妙に違いますがおそらくソースは一致していると思います。後で確認してみます。 =>1.8.0_144のソースを確認しました。550行目周辺は1.8.0_133と同一でした。追記2にかいた直接原因(rsrc:)が直接原因である点は確かだと思います。 追記2: 追記された情報から原因はURLのプロトコルがrsrc:になっている点と思います。なんでこういうプロトコルになるかといえば生成されたjarを実行する際にcodebaseのURLプロトコルがrsrc:になることだと思います。自分はこうした経験がないのでなんでそんなことになるかわかりませんでした。そこで検索してみたところそれらしい記事を見つけました。 RMI - unknown protocol: rsrc この記事の最後の回答をみると原因はeclipseにあるようです。対処のための提案にはjarの生成をAntか、Fat-Jarプラグインでやるといったことが書いてあります。 > > Suggestion: Try to generate the jar file with Ant! > > Or you can try the Fat-Jar Plugin for Eclipse, BUT don't activate the One-Jar option... > > it seems to work (although the version is 0.0.31) > > > 最近はEclipseを使わないこともあり、詳しくはどうするのがいいか明確にはコメントできないのですが、上記を参考にしてみてはいかがでしょうか。 追記3: よくよく考えると、上記対処に「BUT don't activate the One-Jar option...」と書いてありますね。ということは質問者さんがやりたいことがFat-Jarプラグインでも不可能ということになるのかな。Antでやれと言われると自分だったらへこたれてしまいます。Eclipseに詳しい方のコメントを待った方がいいのかもです。 追記4: Eclipseで実行可能JARファイルでエクスポートした時のディレクトリ構成の違い をみるとjarのパッケージングのしかたに違いはあるものの下記のいずれも参照している外部ライブラリーは生成されるjarに含まれることになると思うので、そうしてもよければ1 or 3を選択するのが回避策になるのではないかという気がしました。jarのパッケージ構成について暗いので2でなければならない理由があるかどうかわかりません。間違ってたらゴメンナサイ。 1 〇生成されるJARに必須ライブラリーを抽出 2 ×生成されるJARに必須ライブラリーをパッケージ 3 〇生成されるJARの隣のサブフォルダーに必須ライブラリーをコピー