When I run an Arquillian test that uses ShrinkWrap descriptors, I get a nonsensical SAXParseException "content is not allowed in prolog"

    When I run an Arquillian test that uses ShrinkWrap descriptors, I get a nonsensical SAXParseException saying that "content is not allowed in prolog". Why?

     

    Most likely you've passed a file name where the descriptors API expected a string containing XML data. It's an easy mistake to make - compare the following incorrect example with the corrected example that follows it:

     

    BeansDescriptor beansXml = Descriptors.importAs(BeansDescriptor.class)
                    .from("src/main/webapp/WEB-INF/beans.xml");
    

     

    vs the corrected:

     

    BeansDescriptor beansXml = Descriptors.importAs(BeansDescriptor.class)
                    .from(new File("src/main/webapp/WEB-INF/beans.xml"));
    

     

    So, next time you see an trace like this from one of your tests, you'll know what's wrong:

     

    java.lang.RuntimeException: Could not invoke deployment method: public static org.jboss.shrinkwrap.api.spec.JavaArchive com.example.shrinkwraptestsk
    eleton.DemoTest.createDeployment()
       ....
    Caused by: java.lang.reflect.InvocationTargetException
       ....
    Caused by: org.jboss.shrinkwrap.descriptor.api.DescriptorImportException: Could not import XML from stream
       ....
    Caused by: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Content is not allowed in prolog.
    

     

    There's an open issue with a proposed API change to make this error harder to make.