Techいつもコードのことばかり考えている人のために。typeを推測できるようになります。公式ドキュメントにも書かれています。"/path/to/content-types.properties")と指定してもさっぱり有効になりませんでした。拡張子.cssをtext/cssと判定させるためには、以下のような設定ファイルを用意します。file_extensions=.css以下のようなコードを用意して、設定ファイルを読み込んでみましが、mimeTypeにはnullが入りました。-Dcontent.types.user.table=/path/to/content-types.propertiesというふうに実行前に設定されるようにしておくと意図した通りにmimeTypeにはtext/cssが入ります。OverflowにSystem.setPropertyでセットすれば反映されると書かれていたので、それを鵜呑みにして「正しく動かない!自分の書いたコードがおかしいのか?」と思いましたが、実際にはその回答が誤りでした。順番に、java.net.URLConnectionのguessContentTypeFromNameメソッドの挙動を、openJDK10のコードを例に追いかけていきましょう。openJDKの該当するソースコードは以下の場所に有ります。Typeに関連するデータは、FileNameMapというクラスに格納されていること、値が無ければ(nullならば)されていなければsun.net.www.MimeTable.loadTableを呼び出して、初期化していることが分かります。typeを取得する機能を提供します。typeのテーブルを保持するsun.net.www.MimeTable.loadTableの中身を追いかけてみましょう。sun.net.www.MimeTable.loadTableは以下のファイルに収録されています。}}loadTableから始まり、DefaultInstanceHolderクラスにdefaultInstanceというstaticなメンバが有ることが分かります。typeのデータがロードされている、ということなのです。Typeをセットしています。mapがnullか否かを判定するロジックっていらなくない?って思いますね。実際にロードする部分のコードをもう少し追いかけてみましょう。parse(entries);}確かにcontent.types.user.tableというシステムプロパティが設定されていれば、そこからパスを取得するようになっていますね。存在しなければデフォルトのcontent-types.propertiesを取得しています。Typeを設定する機能について、テストコードが存在しません。確かにこれではグローバルにシステムプロパティを汚染しないとテストが書けないですね...おわりに以上、java.net.URLConnectionのguessContentTypeFromNameにおけるcontent.types.user.tableの取扱について、実際のJavaのライブラリのコードを追いかけてみました。依存関係(sun.net.www.MimeTable.loadTableがjava.net.URLConnectionに依存している)がおかしいとか、初回利用時ではなく、クラスロード時に強制的に初期化が行われ、以降は再設定もできないとか、そもそもテストが無いとか、よく考えるとguessContentTypeFromNameというメソッド自体java.net.URLConnectionではなく、独立したMIMEに関するクラスに所属しているべきでは?と、標準のJavaのライブラリでも色々と設計が気になるところが有るんだな、というのが今回の感想でした。前回のエントリの続きです。Type-Sを買った月別アーカイブはてなブログをはじめよう!magnoliakさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。