5

2つのURIオブジェクトがあります。1つはJARファイル内のフォルダーを指しており、もう1つは同じJARファイル内のファイルを指しています。ファイルは、最初のURIで指定されたディレクトリのサブフォルダにあります。相対URIを作成して、結果のURIにJAR内のファイルへの相対パスのみが含まれるようにするのが好きです。

  • フォルダURI

    jar:file:/C:/Users/inagy/.m2/repository/hu/inagy/my-config-artifact/2.0-SNAPSHOT/my-config-artifact-2.0-SNAPSHOT.jar!/conf/
    
  • リソースURI

    jar:file:/C:/Users/inagy/.m2/repository/hu/inagy/my-config-artifact/2.0-SNAPSHOT/my-config-artifact-2.0-SNAPSHOT.jar!/conf/somesubpath/someconfig.xml
    
  • 呼び出した後folderUri.relativize(resourceURI)、結果として次のURIを期待しています:

    somesubpath/someconfig.xml
    

ただし、resourceURIが返されます。これは、URIクラスのJavadocによると、JDKコードがこの2つのパスを相互に関連していないことを検出することを意味します。

これはバグですか、それとも私は何か間違ったことをしていますか?

4

2 に答える 2

9

私もこれに少し悩まされてきました。答えは、JARファイルのセマンティクスとは関係ありませjar:ん。URIの構文と関係があります。「相対化」するには、URIが階層的で、不透明ではない必要があります。java.net.URIのJavaDocから次のことに注意してください。

最高レベルでは、文字列形式のURI参照(以下、単に「URI」)の構文は次のとおりです。

[scheme:]scheme-specific-part[#fragment]

..。

不透明なURIは、スキーム固有の部分がスラッシュ文字('/')で始まらない絶対URIです。不透明なURIは、それ以上の解析の対象にはなりません。

..。

階層URIは、構文に従ってさらに解析される可能性があります

[scheme:][//authority][path][?query][#fragment]

次のようなJARURIは次のようjar:file:///home/me/foo.jar!/conf/に解析されます。

  • スキーム=jar
  • スキーム固有の部分=file:///home/me/foo.jar!/conf/
  • フラグメント=(なし)

スキーム固有の部分は「、」で始まら/ないため、階層URIとは見なされません。jar:URIクラスはURI (または任意のURI)を特別に処理しないため、その部分階層型file://のネストされたURIであることを認識できません。

jar:URIは不透明で階層的ではないため、URI#relativize()で文書化されている動作の影響を受けます

このURIに対する特定のURIの相対化は、次のように計算されます。

  1. このURIまたは指定されたURIのいずれかが不透明である場合[...]、指定されたURIが返されます。

編集:不透明なURIに関する重要な部分を省略しました。

于 2013-01-15T22:38:27.893 に答える
-1

somesubpath/someconfig.xmlURIではありません。プロトコル(のようなfile:)がありません。実際、完全なURLのみjar:file:/C:/Users/inagy/.m2/repository/hu/inagy/my-config-artifact/2.0-SNAPSHOT/my-config-artifact-2.0-SNAPSHOT.jar!somesubpath/someconfig.xmlが想像できますが、jarプロトコルはのようなベースドキュメント/ディレクトリを渡しません/conf

したがって、絶対パスのみを使用できます。一意のリソース識別子を表すURIの結果。

相対ドキュメント(.js)を含むベースドキュメント(.html)はありません。


URIはデータを取得するためのものです。jar内のファイルの相対URIをどのように記述しますか?どこに関連して?「jar:」プロトコルはJavaコード内でのみ使用されるため、「現在のファイル」のコンテキストはありません。したがって、相対URIは実装されません。

于 2012-10-24T09:20:15.477 に答える