0

うまくいけば、誰かがこれで私を助けてくれます。

ClassLoader を使用することが、コンテンツをロードする最も信頼できる方法であると理解しています。

public class Pipeline{
   public static URL getResource(String filename) {
      return ClassLoader.getSystemResource(filename);
   }

   public static InputStream getResourceAsStream(String filename) {
      return ClassLoader.getSystemResourceAsStream(filename);
   }
}

「[jar bundle]/resources/abc.png」にファイルがある場合、次のようにロードします。

URL url = Pipeline.getResource("resources/abc.png"); 

ロードは簡単です。
貯蓄は私を得るものです。

実行中にデータを収集し、終了時にそのデータを保存し、次回にデータをロードして追加し続けるプログラムがあります。

私が考える最も簡単な解決策は、ClassLoaderがそれらを取得できるようにjarバンドルに保存することです。これは可能ですか?それともおすすめ?

リソースを取得して保存するために「ファイル」に頼る必要がない限り、リソースをjarの外に置いてもかまいません。(綺麗に出来ない限り)

folder/application.jar

folder/resources/abc.png

../ ClassLoader が探している場所から 1 つ戻ることができれば、実際に jar ファイルを含むディレクトリからデータをきれいに取得するのは簡単です。

Pipeline.getResource("../resources/abc.png");

何か案は?

4

1 に答える 1

1

これは、実際にはクラス ローダーの目的ではありません。クラスローダーからリソースをロードすることは、アプリケーションを 1 つのパッケージとしてバンドルし、デプロイ先のシステムがどのように設定されているかを気にせずにコンポーネントが相互に読み取ることができるようにすることを意味します。

JAR 内のファイルがアプリによって変更されることを意図している場合、それはアプリの一部ではないため、おそらく JAR 内にあるべきではありません。

私はあなたのアプリについて多くのコンテキストを持っていませんが、私の提案があなたの状況に有効であることを願っています.

読み取りと書き込みが許可されている作業領域があり、このディレクトリの場所を指定する構成設定を受け入れるという要件をアプリに設定することをお勧めします。Java でこれを行う一般的な方法は、環境変数、システム プロパティ、または JNDI 設定 (コンテナーのデプロイ用) を使用することです。

例:

  1. Tomcat の起動スクリプトは、Tomcat がインストールされている場所を特定し、catalina.home というシステム プロパティを設定して、CATALINA_HOME という環境変数で上書きできるようにします。
  2. JBoss は JBOSS_HOME を探します
  3. Java アプリケーション サーバーは通常、JAVA_HOME を検索して JDK を見つけます。
于 2013-03-07T20:51:09.493 に答える