title: JAXBException: "package" doesnt contain ObjectFactory.class or jaxb.index
body: <p>I have been playing with JAXB / MOXy a lot lately, <strong>and it works great on all my tests and example codes</strong>. I exclusively using binding files, that's why I'm using MOXy.</p>
  
  <p>Please note that in all my examples, I'm NEVER using an ObjectFactory nor a jaxb.index, <strong>and it works GREAT</strong>.</p>
  
  <p>When I get back to my business, I get a nasty JAXB Exception saying that my package does not contain an ObjectFactory or jaxb.index.</p>
  
  <p>My project also invovles Spring and Hibernate, JUnit and DBUnit.</p>
  
  <p>Here is some sample code: I have an abstract class called AContributionPhysicalSupport.</p>
  
  <pre><code>package org.pea.openVillages.pojo.contribution.implementation;
  
  import java.io.Serializable;
  
  import javax.persistence.Column;
  import javax.persistence.DiscriminatorColumn;
  import javax.persistence.DiscriminatorType;
  import javax.persistence.Entity;
  import javax.persistence.GeneratedValue;
  import javax.persistence.GenerationType;
  import javax.persistence.Id;
  import javax.persistence.Inheritance;
  import javax.persistence.InheritanceType;
  import javax.persistence.Table;
  
  @Entity
  @Table(name = "TOV_CONTRIBUTION_PHYSICAL_SUPPORT")
  @Inheritance(strategy = InheritanceType.JOINED)
  @DiscriminatorColumn(name = "SUPPORT_TYPE", discriminatorType = DiscriminatorType.STRING, length = 20)
  public abstract class AContributionPhysicalSupport implements Serializable
  {
  /* *****************************************************************
   * 
   * PROPERTIES
   * 
   * *****************************************************************
   */
  
  /**
   * for Serializable
   */
  private static final long serialVersionUID = 1L;
  
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  @Column(name = "SUPPORT_ID")
  private Long physicalSupportId;
  
  @Column(name = "SUPPORT_TYPE", nullable = false, length = 20, updatable = false, insertable = false)
  private String supportType;
  
  /* *****************************************************************
   * 
   * CONSTRUCTORS
   * 
   * *****************************************************************
   */
  
  public AContributionPhysicalSupport()
  {
  
  }
  
  /* *****************************************************************
   * 
   * GETTERS AND SETTERS
   * 
   * *****************************************************************
   */
  
  /**
   * @return the physicalSupportId
   */
  public Long getPhysicalSupportId()
  {
      return physicalSupportId;
  }
  
  /**
   * @param physicalSupportId
   *            the physicalSupportId to set
   */
  public void setPhysicalSupportId(Long physicalSupportId)
  {
      this.physicalSupportId = physicalSupportId;
  }
  
  /**
   * @return the supportType
   */
  public String getSupportType()
  {
      return supportType;
  }
  
  /**
   * @param supportType
   *            the supportType to set
   */
  public void setSupportType(String supportType)
  {
      this.supportType = supportType;
  }
  
  /* *****************************************************************
   * 
   * UTILS
   * 
   * *****************************************************************
   */
  
  /*
   * (non-Javadoc)
   * 
   * @see java.lang.Object#toString()
   */
  @Override
  public String toString()
  {
      return this.getClass() + " [physicalSupportId=" + physicalSupportId + ", supportType=" + supportType + "]";
  }
  
  /*
   * (non-Javadoc)
   * 
   * @see java.lang.Object#hashCode()
   */
  @Override
  public int hashCode()
  {
      final int prime = 31;
      int result = 1;
      result = prime * result + ((physicalSupportId == null) ? 0 : physicalSupportId.hashCode());
      result = prime * result + ((supportType == null) ? 0 : supportType.hashCode());
      return result;
  }
  
  /*
   * (non-Javadoc)
   * 
   * @see java.lang.Object#equals(java.lang.Object)
   */
  @Override
  public boolean equals(Object obj)
  {
      if (this == obj)
      {
          return true;
      }
      if (obj == null)
      {
          return false;
      }
      if (!(obj instanceof AContributionPhysicalSupport))
      {
          return false;
      }
      AContributionPhysicalSupport other = (AContributionPhysicalSupport) obj;
      if (physicalSupportId == null)
      {
          if (other.physicalSupportId != null)
          {
              return false;
          }
      }
      else if (!physicalSupportId.equals(other.physicalSupportId))
      {
          return false;
      }
      if (supportType == null)
      {
          if (other.supportType != null)
          {
              return false;
          }
      }
      else if (!supportType.equals(other.supportType))
      {
          return false;
      }
      return true;
  }
  }
  </code></pre>
  
  <p>Class Video inherits from AContributionPhysicalSupport :</p>
  
  <pre><code>package org.pea.openVillages.pojo.contribution.implementation;
  
  import javax.persistence.Column;
  import javax.persistence.DiscriminatorValue;
  import javax.persistence.Entity;
  import javax.persistence.Table;
  
  @Entity
  @Table(name = "TOV_VIDEO")
  @DiscriminatorValue("VIDEO")
  public class Video extends AContributionPhysicalSupport
  {
  /* *****************************************************************
   * 
   * PROPERTIES
   * 
   * *****************************************************************
   */
  
  /**
   * for serializable
   */
  private static final long serialVersionUID = 1L;
  
  @Column(name = "VIDEO_TYPE", nullable = false, length = 20)
  private String videoType;
  
  @Column(name = "VIDEO_SIZE")
  private Long videoSize;
  
  @Column(name = "VIDEO_LENGTH")
  private Long videoLength;
  
  /* *****************************************************************
   * 
   * CONSTRUCTORS
   * 
   * *****************************************************************
   */
  
  public Video()
  {
      super();
  }
  
  /* *****************************************************************
   * 
   * GETTERS AND SETTERS
   * 
   * *****************************************************************
   */
  
  /**
   * @return the videoType
   */
  public String getVideoType()
  {
      return videoType;
  }
  
  /**
   * @param videoType
   *            the videoType to set
   */
  public void setVideoType(String videoType)
  {
      this.videoType = videoType;
  }
  
  /**
   * @return the videoSize
   */
  public Long getVideoSize()
  {
      return videoSize;
  }
  
  /**
   * @param videoSize
   *            the videoSize to set
   */
  public void setVideoSize(Long videoSize)
  {
      this.videoSize = videoSize;
  }
  
  /**
   * @return the videoLength
   */
  public Long getVideoLength()
  {
      return videoLength;
  }
  
  /**
   * @param videoLength
   *            the videoLength to set
   */
  public void setVideoLength(Long videoLength)
  {
      this.videoLength = videoLength;
  }
  
  /* *****************************************************************
   * 
   * UTILS
   * 
   * *****************************************************************
   */
  
  /*
   * (non-Javadoc)
   * 
   * @see java.lang.Object#toString()
   */
  @Override
  public String toString()
  {
      return super.toString() + " Video [videoType=" + videoType + ", videoSize=" + videoSize + ", videoLength="
              + videoLength + "]";
  }
  
  /*
   * (non-Javadoc)
   * 
   * @see java.lang.Object#hashCode()
   */
  @Override
  public int hashCode()
  {
      final int prime = 31;
      int result = super.hashCode();
      result = prime * result + ((videoLength == null) ? 0 : videoLength.hashCode());
      result = prime * result + ((videoSize == null) ? 0 : videoSize.hashCode());
      result = prime * result + ((videoType == null) ? 0 : videoType.hashCode());
      return result;
  }
  
  /*
   * (non-Javadoc)
   * 
   * @see java.lang.Object#equals(java.lang.Object)
   */
  @Override
  public boolean equals(Object obj)
  {
      if (this == obj)
      {
          return true;
      }
      if (!super.equals(obj))
      {
          return false;
      }
      if (!(obj instanceof Video))
      {
          return false;
      }
      Video other = (Video) obj;
      if (videoLength == null)
      {
          if (other.videoLength != null)
          {
              return false;
          }
      }
      else if (!videoLength.equals(other.videoLength))
      {
          return false;
      }
      if (videoSize == null)
      {
          if (other.videoSize != null)
          {
              return false;
          }
      }
      else if (!videoSize.equals(other.videoSize))
      {
          return false;
      }
      if (videoType == null)
      {
          if (other.videoType != null)
          {
              return false;
          }
      }
      else if (!videoType.equals(other.videoType))
      {
          return false;
      }
      return true;
  }
  
  }
  </code></pre>
  
  <p>Here is my binding file (there are other classes inheriting from AContributionPhysicalSupport....)</p>
  
  <pre><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
  &lt;xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm" package-name="org.pea.openVillages.pojo.contribution.implementation"&gt;
  
  &lt;java-types&gt;
  
      &lt;java-type name="AContributionPhysicalSupport"&gt;
          &lt;xml-root-element name="contribution-physical-support" /&gt;
          &lt;xml-type prop-order="physicalSupportId supportType" /&gt;
          &lt;java-attributes&gt;
              &lt;xml-attribute java-attribute="physicalSupportId" name="support-id" /&gt;
              &lt;xml-element java-attribute="supportType" name="support-type" /&gt;
          &lt;/java-attributes&gt;
      &lt;/java-type&gt;
  
      &lt;java-type name="ExternalFileFormat"&gt;
          &lt;xml-root-element name="ext-file-format" /&gt;
          &lt;xml-type prop-order="fileType fileSize" /&gt;
          &lt;java-attributes&gt;
              &lt;xml-element java-attribute="fileType" name="file-type" /&gt;
              &lt;xml-element java-attribute="fileSize" name="file-size" /&gt;
          &lt;/java-attributes&gt;
      &lt;/java-type&gt;
  
      &lt;java-type name="InternalFileFormat"&gt;
          &lt;xml-root-element name="int-file-format" /&gt;
          &lt;xml-type prop-order="fileSize" /&gt;
          &lt;java-attributes&gt;
              &lt;xml-element java-attribute="fileSize" name="file-size" /&gt;
          &lt;/java-attributes&gt;
      &lt;/java-type&gt;
  
      &lt;java-type name="Video"&gt;
          &lt;xml-root-element name="video" /&gt;
          &lt;xml-type prop-order="videoType videoSize videoLength" /&gt;
          &lt;java-attributes&gt;
              &lt;xml-element java-attribute="videoType" name="video-type" /&gt;
              &lt;xml-element java-attribute="videoSize" name="video-size" /&gt;
              &lt;xml-element java-attribute="videoLength" name="video-length" /&gt;
          &lt;/java-attributes&gt;
      &lt;/java-type&gt;
  
  &lt;/java-types&gt;
  
  &lt;/xml-bindings&gt;
  </code></pre>
  
  <p>And now my test :</p>
  
  <pre><code>@Test
  public void testYATMarshal() throws Exception
  {
      Video toto = new Video();
      toto.setPhysicalSupportId(new Long(1));
      toto.setSupportType("VIDEO");
      toto.setVideoLength(new Long(358));
      toto.setVideoSize(new Long(5775));
      toto.setVideoType("avi");
  
      FileReader videoBindFile = new FileReader(
              "src/main/resources/xml-mapping/ContributionImpl-binding.xml");
      List&lt;Object&gt; videoBindList = new ArrayList&lt;Object&gt;();
      videoBindList.add(videoBindFile);
  
      Map&lt;String, List&lt;Object&gt;&gt; videoMetaMap = new HashMap&lt;String, List&lt;Object&gt;&gt;();
      videoMetaMap.put("org.pea.openVillages.pojo.contribution.implementation", videoBindList);
      Map&lt;String, Object&gt; videoProperties = new HashMap&lt;String, Object&gt;();
      videoProperties.put(JAXBContextProperties.OXM_METADATA_SOURCE, videoMetaMap);
  
      JAXBContext context = JAXBContext.newInstance("org.pea.openVillages.pojo.contribution.implementation",
              Video.class.getClassLoader(), videoProperties);
      Marshaller marshaller = context.createMarshaller();
      marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
  
      marshaller.marshal(toto, System.out);
  }
  </code></pre>
  
  <p>and last but not least the Exception :</p>
  
  <pre><code>javax.xml.bind.JAXBException: Provider com.sun.xml.internal.bind.v2.ContextFactory could not be instantiated: javax.xml.bind.JAXBException: "org.pea.openVillages.pojo.contribution.implementation" doesnt contain ObjectFactory.class or jaxb.index
   - with linked exception:
  [javax.xml.bind.JAXBException: "org.pea.openVillages.pojo.contribution.implementation" doesnt contain ObjectFactory.class or jaxb.index]
  at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:146)
  at javax.xml.bind.ContextFinder.find(ContextFinder.java:347)
  at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:431)
  at org.pea.openVillages.dao.service.impl.ContributionDAOImplTest.testYATMarshal(ContributionDAOImplTest.java:187)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.lang.reflect.Method.invoke(Method.java:606)
  at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
  at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
  at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
  at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
  at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
  at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
  at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
  at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83)
  at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
  at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
  at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:88)
  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
  at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
  at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
  at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
  at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)
  at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
  at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
  at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
  at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
  at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
  at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
  Caused by: javax.xml.bind.JAXBException: "org.pea.openVillages.pojo.contribution.implementation" doesnt contain ObjectFactory.class or jaxb.index
  at com.sun.xml.internal.bind.v2.ContextFactory.createContext(ContextFactory.java:216)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.lang.reflect.Method.invoke(Method.java:606)
  at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:172)
  at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:132)
  ... 33 more
  </code></pre>
  
  <p>More info :</p>
  
  <ul>
  <li>My test package (where I have my JUnit test class) contains a jaxb.properties file</li>
  <li>My JUnit test class is really a DBUnit / SpringJUnit class, since I want to marshal objects from a DB</li>
  <li>Marshalling from DB or marshalling a simple object (like shown in my example) generate the same Exception</li>
  <li>And, of course, adding a jaxb.index in the package doesn't change anything</li>
  </ul>
  
  <p>Four eyes are better than two. I'm not getting what I'm doing wrong. If somebody sees it, please let me know.</p>
  
  <p>Cheers</p>