Something fishy in JPA ...
The structure is like this:
* ejb_pkg_scope.ear
** ejb_pkg_scope.jap
*** META-INF
**** persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence
xmlns="http://java.sun.com/xml/ns/persistence"
version="1.0">
<persistence-unit name="CTS-SCOPE-UNIT">
<description>Persistence Unit for CTS EE Propagation Tests.
If the transaction-type is not specified,
the default is JTA.</description>
<jta-data-source>jdbc/DB1</jta-data-source>
<jar-file>lib/common.jar</jar-file>
</persistence-unit>
</persistence>
In our JPA we do this:
public void start() throws Exception
{
log.info("Starting persistence unit " + kernelName);
Properties props = new Properties();
props.putAll(defaultPersistenceProperties);
props.put(HibernatePersistence.JACC_CONTEXT_ID, getJaccContextId());
List<URL> jarFiles = new ArrayList<URL>();
Set<String> files = metaData.getJarFiles();
if (files != null)
{
for (String jar : files)
{
jarFiles.add(getRelativeURL(jar));
}
}
VirtualFile root = getPersistenceUnitRoot();
log.debug("Persistence root: " + root);
// hack the JPA url
URL url = VFSUtils.getCompatibleURL(root);
PersistenceUnitInfoImpl pi = new
PersistenceUnitInfoImpl(metaData, props, di.getClassLoader(), url,
jarFiles, initialContext);
private URL getRelativeURL(String jar)
{
try
{
return new URL(jar);
}
catch (MalformedURLException e)
{
try
{
URL url = di.getFile("").toURL();
return new URL(url, jar); <--- XXX
}
catch (Exception e1)
{
throw new RuntimeException("could not find relative path: "
+ jar, e1);
}
}
}
How should this know that it actually shouldn't go and look into .jar,
but .ear instead?
Beats me ... as XXX clearly points to .jar's path.
Shelly McGowan wrote:
Ales,
The packaging of this .ear is testing the following assertion defined
in the Persistence Specification:
One or more jar files may be specified using the jar-file elements
instead of, or in addition to the mapping files specified in the
mapping-files elements. If specified, these JAR files will be
searched for managed persistence classes and any mapping metadata
annotations found on them will be processed or they will be mapped
using the mapping annotation defaults defined by this specification.
**Such JAR files are specified relative to the root of the
persistence unit.**
persistence.xml: <jar-file>lib/common.jar</jar-file>
The persistence unit is at the root of the .ear.
Shelly