0

この特定のコードを Java ライブラリ (最終的には JAR になります) としてエクスポートする必要があるユース ケースがありますが、問題は、ファイル システム上の物理ファイルに格納されている情報の一部を使用する必要があることです。

ここで 2 つの質問があります。

1)これらのファイルをファイルシステムのどこに置くべきですか(私が考えることができる1つのオプションは、ライブラリを含むJavaモジュールのリソースディレクトリにありました:リソースディレクトリもjarにコンパイルされることに疑問がありますか?)

2) 外部 Java アプリケーションからこのライブラリを使用している場合、ライブラリはどのようにしてファイルを見つけることができますか? 彼らはまだクラスパスにいますか?

4

5 に答える 5

1

2つのオプションがあります。最初のオプションは、ファイルをパッケージ構造内に配置して、jar内にパックされるようにすることです。次のようなコードからそれらを取得します。

getClass().getResourceAsStream("/path/to/your/resource/resource.ext");

Aという名前のクラスの静的メソッドから呼び出す場合は、次のように記述します。

A.class.getResourceAsStream("/path/to/your/resource/resource.ext");

パスの「/path」部分は最上位のパッケージであり、resource.extはファイル名です。

もう1つのオプションは、それらをjarパッケージの外に配置することですが、jarはそれらの場所を知る必要があります。

  • プログラムへの引数として指定します(java -jar program.jar system / path / to / file)
  • パスを使用してファイルを読み取る場所をハードコードします

私があなたの質問を理解してそれに答えた方法、それはクラスパスとは何の関係もありません:

CLASSPATH変数は、JDKツールを含むアプリケーションにユーザークラスを探す場所を指示する1つの方法です。(JRE、JDKプラットフォーム、および拡張機能の一部であるクラスは、ブートストラップクラスパスや拡張機能ディレクトリなどの他の手段で定義する必要があります。)

編集:しかし、それでも、そこに置いて、次のようなコードから取得することができます:

System.getProperty("java.class.path");

ただし、それを解析するにはいくつかのロジックが必要になります。

于 2012-10-09T10:37:59.520 に答える
0

これらのファイルをファイルシステムのどこに置くべきか

これを構成可能にするのは良い考えですが、それはあなた次第です。また、ホストオペレーティングシステム/ディストリビューションの規則に適合させることもお勧めしますが、これらはアプリケーションの性質によって異なります。

外部Javaアプリケーションからこのライブラリを使用している場合、ライブラリはどのようにしてファイルを見つけることができますか?

通常、構成プロパティまたは初期化パラメーターを使用して、場所を保持/渡します。ライブラリではなくアプリケーションを作成している場合は、Java Preferences APIを使用できますが、これはおそらくライブラリには不適切な選択です。

彼らはまだクラスパスにいますか?

場所をクラスパスに配置した場合にのみ...そしてそれは構成をよりトリッキーにするでしょう。これらのファイルはファイルシステムに保存する必要があることを考えると、FileInputStreamまたは同様のものを使用することをお勧めします。

于 2012-10-09T10:35:32.927 に答える
0

Eclipseを使用して、jarが必要とするファイルを配置するパッケージ「resources」を常に作成します。私は(ほとんどどこからでも)ファイルにアクセスします

this.getClass().getClassLoader().getResources("/resources/file.ext");

export-> runnable jarを使用すると、これらのファイルはすべて.jarに含まれます。しかし、これが正しい方法かどうかはわかりません。また、リソースの前の「/」については100%確信が持てないので、省略してください。

于 2012-10-09T10:36:36.793 に答える
0

別の質問の一部として関連する回答を見つけました: How to load a folder from a .jar?

次のコードを使用して、ファイルを正常に取得できます。

   /**
   * List directory contents for a resource folder. Not recursive.
   * This is basically a brute-force implementation.
   * Works for regular files and also JARs.
   * 
   * @author Greg Briggs
   * @param clazz Any java class that lives in the same place as the resources you want.
   * @param path Should end with "/", but not start with one.
   * @return Just the name of each member item, not the full paths.
   * @throws URISyntaxException 
   * @throws IOException 
   */
  String[] getResourceListing(Class clazz, String path) throws URISyntaxException, IOException {
      URL dirURL = clazz.getClassLoader().getResource(path);
      if (dirURL != null && dirURL.getProtocol().equals("file")) {
        /* A file path: easy enough */
        return new File(dirURL.toURI()).list();
      } 

      if (dirURL == null) {
        /* 
         * In case of a jar file, we can't actually find a directory.
         * Have to assume the same jar as clazz.
         */
        String me = clazz.getName().replace(".", "/")+".class";
        dirURL = clazz.getClassLoader().getResource(me);
      }

      if (dirURL.getProtocol().equals("jar")) {
        /* A JAR path */
        String jarPath = dirURL.getPath().substring(5, dirURL.getPath().indexOf("!")); //strip out only the JAR file
        JarFile jar = new JarFile(URLDecoder.decode(jarPath, "UTF-8"));
        Enumeration<JarEntry> entries = jar.entries(); //gives ALL entries in jar
        Set<String> result = new HashSet<String>(); //avoid duplicates in case it is a subdirectory
        while(entries.hasMoreElements()) {
          String name = entries.nextElement().getName();
          if (name.startsWith(path)) { //filter according to the path
            String entry = name.substring(path.length());
            int checkSubdir = entry.indexOf("/");
            if (checkSubdir >= 0) {
              // if it is a subdirectory, we just return the directory name
              entry = entry.substring(0, checkSubdir);
            }
            result.add(entry);
          }
        }
        return result.toArray(new String[result.size()]);
      } 

      throw new UnsupportedOperationException("Cannot list files for URL "+dirURL);
  }
于 2012-10-15T09:54:26.860 に答える
0

プロパティ ファイルまたはこのような手法でファイルの場所を渡すことができます。

于 2012-10-09T10:28:48.150 に答える