3

他のMavenモジュールのリソースをどのように使用できますか?私の目標はAbstractImportClass、特定のMavenモジュールにインポートされるファイルと同様にファイルを提供することです。そして、このクラスを拡張する他のモジュール内でこのモジュールを使用します。

ModuleA、、を含むsrc/main/java/MyAbstractImportClass.javaとしましょうsrc/main/resources/MyImport.csv

ここで、で抽象インポートクラスを使用したいと思いますModuleB。むしろ、それを拡張し、abstract-fileimportといくつかのカスタム関数を使用します。次にModuleC、アブストラクトのインポートといくつかのカスタム関数も使用します。

問題は次のとおりです。抽象クラスでのインポートはととともに行わreaderInputStreamます。ModuleAだけを実行すると、すべて問題ありません。

しかし、maven pomを介してモジュールをインクルードし、モジュールを拡張してインポートを呼び出そうとするとNullPointerException、リーダーが使用されている行に到達します。

当然のことながら、この方法で外部モジュールリソースを使用することはできません。

しかし、代わりにこれをどのように利用できますか?


アップデート:

モジュールA:

src/main/java/path/to/MyClassA.java
src/main/resources/path/to/test.txt

abstract class MyClassA {
    public static String TESTFILE = test.txt;

    List<String> doImport(String filename) {
        InputStream fileStream = resourceClass.getResourceAsStream(filename);
        //some precessing
        return list;
    }
}

モジュールB:

src/main/java/path/to/MyClassB.java

class MyClassB implements MyClassA {
    List<String> list = doImport(TESTFILE);
}

MyClassBをAと同じディレクトリに配置すると、すべてが正常に機能します。独自のモジュールでBをビルドすると、InputStreamのNullPointerが取得されます。これは、ファイルが見つからないことを意味します。

4

3 に答える 3

0

コードが何をするのかは明確ではありません。リソースの読み方のサンプルを提供していただけますか?適切に実行すれば、クラスパスのリソースファイルからInputStreamを取得しても、問題はありません。ModuleA.jarにリソースファイルが含まれていることを確認することから始めることができます。

于 2012-05-24T19:51:50.297 に答える
0

以下を確認する必要があります。

  1. モジュールBは、pom.xmlのモジュールAに依存しています
  2. 渡された「filename」パラメーターは「/」で始まります。つまり、「filename」パラメーターは「path / to/test.txt」以外の「/path/to/test.txt」です。

これらの2つの条件が満たされている場合、プログラムは機能するはずです。

于 2012-05-25T03:28:17.383 に答える
0

あなたの問題はMavenにまったく関係していないと思います。Class.getResourceAsStream()は、呼び出し元のクラスオブジェクトを基準にした相対パスを解決します。したがって、そのメソッドを抽象クラスで使用する場合、そのメソッドのすべてのサブクラスが異なる場所でリソースを探している可能性があります。

たとえば、次の3つのクラスがあります。

素晴らしい:

package com.foo;
public class Super {
    { System.out.println(getClass().getResourceAsStream("test.properties")); }
}

Sub1、Superのサブクラス:

package com.foo.bar;
import com.foo.Super;
public class Sub1 extends Super {}

Sub2、別のサブクラス:

package com.foo.bar.baz;
import com.foo.Super;
public class Sub2 extends Super {}

スーパーを作成すると、クラスパスリソース「/com/foo/test.properties」が検索されます。これは、パス「test.properties」がクラスcom.foo.Superに対して解決されるためです。Sub1を作成すると、代わりに「/com/foo/bar/test.properties」が検索され、Sub2インスタンスの場合は、「/ com / foo / bar / baz/test.properties」が検索されます。 。

相対パスではなく、リソースへの絶対パスを使用するか、サブクラスに相対パスを指定させることができます。それはあなたのデザインとあなたが達成しようとしている抽象化の種類に依存します。

于 2012-05-25T03:33:52.267 に答える