Tuesday, June 19, 2012

JBAS011440: Can't find a persistence unit named null in deployment

Encountering the deployment error "JBAS011440: Can't find a persistence unit named null in deployment" on JBoss AS 7? Using Arquillian?

You probably put your persistence.xml in the wrong place in your archive. Try printing the archive contents.

public class SomeTest {

 public static WebArchive createDeployment() {
  WebArchive war = ShrinkWrap.create(WebArchive.class)
    .addAsResource(new File("src/main/resources/META-INF/persistence.xml"), "META-INF/persistence.xml")
    .addAsWebInfResource(new File("src/main/webapp/WEB-INF/beans.xml"), "beans.xml");
  war.writeTo(System.err, org.jboss.shrinkwrap.api.formatter.Formatters.VERBOSE);
  return war;

 public void blah() {
   // ... 

Note in the above that I've used addAsResource(..., "META-INF/persistence.xml"). In a web archive, addAsManifestResource(..., "persistence.xml") won't work as it'll place it in /META-INF/persistence.xml and the correct (albeit very very strange) location is /WEB-INF/classes/META-INF/persistence.xml

It's a stupid mistake, but when you can't directly see the archive structure it's not always immediately obvious. JBoss's error message doesn't help - "persistence unit named null" ?.

Hopefully a future ShrinkWrap release will add an archive-format-aware API for placing persistence.xml in its wacky location.

All the below are wrong:
  • addAsWebInfResource(..., "persistence.xml") -> /WEB-INF/persistence.xml
  • addAsWebInfResource(..., "META-INF/persistence.xml") -> /WEB-INF/META-INF/persistence.xml
  • addAsManifestResource(..., "persistence.xml") -> /META-INF/persistence.xml
  • addAsResource(..., "persistence.xml") -> /WEB-INF/classes/persistence.xml
If in doubt, use writeTo(...) as shown above to print your archive structure and make sure persistence.xml is in /WEB-INF/classes/META-INF/persistence.xml

1 comment: