2016-06-20 3 views
3

私はこのコードで1.jarどのように依存するjarからローカルリソースを見つけるか?

にパックされたコードを書かれている:

return isProd? "/etc/waze/automation/devices.json": 
      DeviceRepositoryFromJsonFile.class.getClassLoader().getResource("devices.json").getPath().toString(); 

devices.jsonはここにある:

enter image description here

私は1.jarに依存して別のプロジェクトを持っています

しかし、classLoaderローカルのdevices.jsonファイルは見つかりませんが、1つはjarファイルにパッケージされています

これは、ファイルが存在しないことを示しています。

enter image description here

私はこれをどのように修正することができますか?とにかく絶対パスを使用するだけですか?

+0

ローカルdevices.jsonはどこにありますか?私はむしろclasspathに関連する場所に配置することをお勧めします。そうすれば、クラスローダーのどこかに見つけることができます。 – LynxZh

+0

私は自分の場所に追加しました。あなたはあなたの提案の例を挙げていただけますか? –

答えて

1

あなたのスクリーンショットのように、devices.jsonがsrc/main/resourcesにありパッケージがパッケージパスとして正常に処理され、jarファイルのルートディレクトリに置かれている場合は、

DeviceRepositoryFromJsonFile.class.getResource("/devices.json"); 

「/」スラッシュは、クラスパスのルートから検索することを示すために重要です。

1

あなたの質問に直接答えませんが、問題をより早く解決する可能性があります。

私が見る限り、jsonファイルへの絶対パスを検出し、別のメソッドに渡してこのファイルを処理できるようにします。代わりに、それはより簡単に行うことができます。

public byte[] getDevicesJsonBytes() { 
    return isProd 
     ? IOUtils.toByteArray(ABSOLUTE_PATH_TO_PROD_FILE) 
     : IOUtils.toByteArray(DeviceRepositoryFromJsonFile.class.getResourceAsStream(RESOURCE_CLASSPATH); 
} 

それはclassまたはclassLoaderインスタンス上getResourceAsStreamを使用するようにクラスパスリソースを読み込むための一般的な方法を。また、多くのフレームワークは独自のリソース抽象化を持っていますが、今はそれらを必要としないと思います。

関連する問題