質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.75%

  • Java

    13158questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • JavaFX

    378questions

    JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

javaFXプロジェクトをエクスポートするとcssファイルが読み込まれない

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 348

uer03108

score 86

下記のSampleプロジェクトを実行可能なjarファイルとしてエクスポートしました。

イメージ説明

〇生成されるJARに必須ライブラリーを抽出
×生成されるJARに必須ライブラリーをパッケージ
〇生成されるJARの隣のサブフォルダーに必須ライブラリーをコピー

×のjarファイルは実行するとエラーが出ました。
"Invalid stylesheet URL"ということですが、jarファイルを解凍するとcssファイルは含まれています。
eclipse上で実行する場合とパスの設定が違うのでしょうか。

webEngine.setUserStyleSheetLocation(getClass().getResource("/application/webView.css").toExternalForm());
Caused by: java.lang.IllegalArgumentException: Invalid stylesheet URL
        at javafx.scene.web.WebEngine$2.invalidated(WebEngine.java:550)
        at javafx.beans.property.StringPropertyBase.markInvalid(StringPropertyBase.java:109)
        at javafx.beans.property.StringPropertyBase.set(StringPropertyBase.java:144)
        at javafx.beans.property.StringPropertyBase.set(StringPropertyBase.java:49)
        at javafx.scene.web.WebEngine.setUserStyleSheetLocation(WebEngine.java:481)
        at application.EventListenerWeb.<init>(EventListenerWeb.java:40)
        at application.EventController.initialize(EventController.java:113)

追記
読み込むファイルを出力してみました。

        URL url = getClass().getResource("/application/webView.css");

        System.out.println("url " + url);
        System.out.println("url " + url.toExternalForm());

       webEngine.setUserStyleSheetLocation(url.toExternalForm());

動作するJar(〇)

url jar:file:/C:/Users/personal/Documents/job/%e3%82%bf%e3%82%b9%e3%82%af/yahoo/app_E.jar!/application/webView.css
url jar:file:/C:/Users/personal/Documents/job/%e3%82%bf%e3%82%b9%e3%82%af/yahoo/app_E.jar!/application/webView.css

動作しないjar(×)

url rsrc:application/webView.css
url rsrc:application/webView.css


rsrc URLClassLoaderの独自プロトコル?
(https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10142834290)

動作するjarとしないjarで違いが確認できました。
後は、jarファイルを解凍 → 逆コンパイルでコードの違いを確認すると分かるでしょうか。


追記 その2

実行可能jarをデコンパイルしましたが、どれもコードは同じなんですね。

        URL url = 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());

それだと、デコンパイル時に変換が起こっているか、コード以外の部分が原因と考えられそうですが。
深い森に入り込んだような感じです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

原因についてわからないのですが参考になるかも知れない点をコメントしてみます。

スタックトレースから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の隣のサブフォルダーに必須ライブラリーをコピー 

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/09 00:57

    いつもご回答有難うざいます。
    javaも奥が深くて幅が広いですね。
    地道に1つ1つ潰していきます。
    javaのバージョンは"jdk1.8.0_144"になります。

    キャンセル

  • 2017/10/09 02:02

    とても勉強になりました。
    また、下記の様なeclipseのバグサイトがあるんですね。
    Bugzilla(https://bugs.eclipse.org/bugs/)
    バグが出る程の高度なことをやるレベルでもないと思いますが。
    eclipseのjarのエクスポートは不安定な部分が残っているということですかね。

    キャンセル

  • 2017/10/09 03:14

    長々とお付き合い頂き、有難うございます。
    下記がドキュメントになる様ですが、パッケージを分ける理由については掛かれていませんでした。

    https://help.eclipse.org/luna/index.jsp?topic=%2Forg.eclipse.jdt.doc.user%2Freference%2Fref-export-runnable-jar.htm

    https://help.eclipse.org/luna/index.jsp?topic=%2Forg.eclipse.jdt.doc.user%2Ftasks%2Ftasks-37.htm

    キャンセル

  • 2017/10/09 11:12

    ×のjarについては、jar内のフォルダ形式がeclipseと似ているので、相対パスにしているのかなと思いましたが。
    最初にご回答いただいた

    ・null
    ・""
    ・"data:text/css;charset=utf-8;base64,"で始まるもの
    ・"file:", "jar:", "data:"で始まるもの

    に"rsrc:****"が該当しないのでエラーになったと言うことでいいのかな。
    勉強になりました。
    エラー調査も骨が折れますね。

    キャンセル

  • 2017/10/09 12:20

    > eclipseと似ているので、相対パスにしている
    いえ、あくまでgetResourceで求めたURLはcodebaseからの相対になるのでschemeがcodebaseと同じになるのは普通の規則だと思います。
    > 該当しないのでエラーになった
    そうです。rsrcというURL schemeは標準scheme一覧的なページに見当たらないのでeclipse独自ブートローダーの独自仕様と思います。独自schemeなので、schemeを意識するような箇所(本件)では当然問題が起きます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.75%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Java

    13158questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • JavaFX

    378questions

    JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。