Ich habe ein Problem mit der Injektion eines EntityManager
von einem in der Testquelle zu einem Dienst in der Hauptquelle. Die Absicht ist, diese Bibliothek in ein anderes Projekt einzubetten, in dem das Projekt Producer
unter Verwendung seines eigenen PersistenceContext
unitName definieren würde. Wenn ich keinen Producer in den Hauptquellen habe, bekomme ich Caused by: java.lang.IllegalStateException: Unable to retrieve EntityManagerFactory for unitName MY_PU
Fehler.CDI Klassenpfad Problem mit Maven und eingebetteten Glasfischen
Zum Beispiel:
/** 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;
}
Damit mir den Dienst zu testen, muß ich die Maven-Ant-Plugin verwenden, um die * .class-Datei in den target/classes
dir zu bewegen und es vor dem Paket Phase zu entfernen. Das funktioniert, aber es ist kludgy. Ich habe versucht, die <useSystemClassLoader>
und <useManifestOnlyJar>
Parameter im todsicheren Plugin ohne Erfolg zu ändern.
Gibt es einen anderen Weg?
Meine Umgebung
- Maven: 2.2.1
- todsichere: 2.4.2
- Glassfish-embedded-all: 3.1.1
EDIT
beans.xml existiert in beiden (test/main)/resources/META-INF
Ich beginne den GF-Container wie folgt.
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");
Klingt, als ob die Bibliotheken und Klassen im Projekt mit dem kollidieren, was Glassfish lädt. Ich hatte nie großes Glück mit eingebetteten Containern und Maven, weil Maven die Klassenpfade nicht sauber hält. Was passiert, wenn du Glassfish in einer neuen VM drehst? – LightGuard
@LightGuard: Standardmäßig ist savefir forkMode 'once'. Der eingebettete Container sollte also in einer separaten JVM von Maven sein. [Verweis] (http://stackoverflow.com/questions/6813373/how-to-tell-maven2-to-execute-junit-tests-one-by-one-each-in-new-jvm-instance) – Hoon