6

MavenとEclipseを使用して(M2Eを使用して)、java.util.ServiceLoaderに依存していくつかのファクトリクラスを動的にロードするプロジェクトをビルドしています。Mavenで実行すると正常に動作しますが、組み込みのEclipse JUnit4 Runnerを使用してテストを実行すると、サービスの取得に失敗し、テストが成功しません。

META-INF / servicesをJUnitビルドパスに手動で追加するために必要なことはありますか?src / main / resources / META-INF/servicesまたはsrc/main / java / META-INF/servicesのどちらでも機能させることができませんでした。M2Eがビルドパスを設定する方法に関連していますか?まったく新しいプロジェクトでテストを作成しましたが、それでも失敗しました。

失敗している基本的なコードは次のとおりです。

public class TestServiceLoader<S>
{
   public TestServiceLoader(final Class<S> serviceClass)
   {

       ServiceLoader<S> serviceLoader =
            java.util.ServiceLoader.load(serviceClass, serviceClass.getClassLoader());

       Iterator<S> services = serviceLoader.iterator();

       if(!services.hasNext())
       {
           throw new RuntimeException("Failed to get any services for this class");
       }
   }
}

テストは次のようになります。

@Test
public final void testTestServiceLoader()
{
    TestServiceLoader<TestFactory> serviceLoader = new TestServiceLoader<TestFactory>(TestFactory.class);
}

TestFactoryは次のように定義されます。

public interface TestFactory
{

}

TestFactoryImplは次のように定義されます。

public class TestFactoryImpl implements TestFactory
{

}

私はもともとhttp://weblogs.java.net/blog/kohsuke/archive/2009/03/my_project_of_t.htmlのMetaInfServicesジェネレーターを使用していましたが、それを削除して手動でファイルを作成したところ、まだ失敗していました。 Maven Surefireプラグインを使用して実行すると、Eclipseでも同じように成功します。

4

1 に答える 1

1

M2E 開発者は、META-INF/services/ がリソースではあるが機能的な部分である場合でも、すべてのリソースが Maven ビルドに影響を与えると考えているようです。

「実際には、プロジェクトのリソース フォルダーをビルドパスに追加する必要はありません (Maven Builder は追加しなくても機能します)。しかし、これは便利であり、パッケージ エクスプローラーやその他の Eclipse ビューで見栄えがよくなると考えられています。」 M2E よくある質問

それを回避したい場合は、特別な M2E プロファイルを pom.xml ファイルにエンコードして、M2E インクリメンタル ビルド フィルターを作成し、リソースをコピーすることができるようです。Sonatype M2Eclipse Wiki

于 2011-08-25T23:22:25.577 に答える