テストソースのProducer
からEntityManager
をメインソースのサービスに注入する際に問題があります。プロジェクトがProducer
を定義する別のプロジェクトにこのライブラリを埋め込むことが目的です。PersistenceContext
unitNameを使用します。主な情報源にプロデューサーがいないと、Caused by: java.lang.IllegalStateException: Unable to retrieve EntityManagerFactory for unitName MY_PU
というエラーが出ます。例えばメイプルと埋め込みガーリックを使用したCDIクラスパスの問題
:
/** src/main/java/org/sample/service */
@Stateless
public class MyBean {
@Inject
@MyCustomQualifier
private EntityManager em;
}
/** src/test/java/org/sample/service */
public class EntityManagerProducer {
@Produces
@MyCustomQualifier
@PersistenceContext(unitName = "MY_PU")
private EntityManager em;
}
私はサービスをテストするために、私はtarget/classes
ディレクトリに*の.classファイルを移動し、パッケージフェーズの前にそれを削除するにはMavenの蟻プラグインを使用する必要があります。これは動作しますが、それはクルージングです。私は、確信しているプラグインの<useSystemClassLoader>
と<useManifestOnlyJar>
のパラメータを成功させずに変更しようとしました。
別の方法がありますか?
私の環境
- のMaven 2.2.1
- シュア:2.4.2
- のglassfish-埋め込ま-すべて:3.1.1
EDIT
beans.xmlは(test/main)/ resources/META-INF
にあります。私は次のようにGFコンテナを開始します。
Map<String, Object> properties = new HashMap<String, Object>();
properties.put(EJBContainer.MODULES, new File[]{new File("target/classes"), new File("target/test-classes")});
EJBContainer ejbContainer = EJBContainer.createEJBContainer(properties);
Context ctx = ejbContainer.getContext();
MyBean service = ctx.lookup("java:global/ejb-app/classes/MyBean");
プロジェクトのライブラリやクラスのようなサウンドは、glassfishがロードしているものと競合しています。私は、mavenがクラスパスをきれいに保つことができないので、埋め込みコンテナとmavenで幸運を祈ることはありませんでした。あなたが新しいVMでグラスフィッシュを回転させるとどうなりますか? – LightGuard
@ LightGuard:デフォルトでは、確実なforkModeは 'once'です。したがって、組み込みコンテナは、Mavenとは別のJVMになければなりません。 [参照](http://stackoverflow.com/questions/6813373/how-to-tell-maven2-to-execute-junit-tests-one-by-one-each-in-new-jvm-instance) – Hoon