-
1. Re: Including JPA jar in Archive for Hibernate to find
mjobanek Mar 17, 2016 11:27 AM (in response to lindholm)Hi,
could you provide your @Deployment method please?
Thanks
Matous
-
2. Re: Including JPA jar in Archive for Hibernate to find
lindholm Mar 17, 2016 2:46 PM (in response to mjobanek)Here is how I build the Archive:
@Transactional(TransactionMode.ROLLBACK)
@RunWith(Arquillian.class)
public class ArquillianDerbyTest {
private final static Logger logger = LoggerFactory.getLogger(ArquillianDerbyTest.class);
public static final String derbyResource = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" //
+ "<Resources>\n" //
+ " <Resource id=\"jboss/datasource/ubcRegiDomainDS\" type=\"DataSource\">\n" //
+ " JdbcDriver org.apache.derby.jdbc.EmbeddedDriver\n" //
+ " JdbcUrl jdbc:derby:memory:testDB;create=true\n" //
+ " JtaManaged true\n" //
+ " logAbandoned true\n" //
+ " </Resource>\n" //
+ "</Resources>\n";
public static final String oracleResource = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" //
+ "<Resources>\n" //
+ " <Resource id=\"jboss/datasource/ubcRegiDomainDS\" type=\"DataSource\">\n" //
+ " JdbcDriver oracle.jdbc.OracleDriver\n" //
+ " JdbcUrl jdbc:oracle:thin:xxx:1521:SID\n" //
+ " JtaManaged true\n" //
+ " logAbandoned true\n" //
+ " userName user\n" //
+ " password pw\n"
+ " </Resource>\n" //
+ "</Resources>\n";
@PersistenceContext(unitName = "ubcRegiDomain")
protected EntityManager entityManager;
@Resource(mappedName = "jdbc:jboss/datasource/ubcRegiDomainDS")
protected DataSource datasource;
/**
* Create a ShrinkWrap web archive that will be used by the Arquillian/OpenEJB/Hibernate unit tests
* @param caller Calling class so we can find the ArquillianDerbyTestInfo annotation for it
* @return
*/
public static Archive<?> createDeploymentArchive(final Class<?> caller) { // static methods can't see parent so we have to pass it in
String databaseType = "derby";
String resourceString = derbyResource;
final ArquillianDerbyTestInfo testInfo;
if (caller != null) {
testInfo = caller.getAnnotation(ArquillianDerbyTestInfo.class);
if (testInfo != null && testInfo.databaseType().equals(DatabaseType.ORACLE)) {
databaseType = "oracle";
resourceString = oracleResource;
}
} else {
testInfo = null;
}
final PomEquippedResolveStage mavenResolver = Maven.resolver().loadPomFromFile("pom.xml");
final File[] mockitoFile = mavenResolver.resolve("org.mockito:mockito-all").withoutTransitivity().as(File.class);
final WebArchive archive = ShrinkWrap.create(WebArchive.class, "test.war") //
.addPackages(true, ArquillianDerbyTest.class.getPackage()) //
.addAsLibraries(mockitoFile) //
.addAsWebInfResource(new StringAsset(resourceString), "resources.xml") //
.addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml") //
.addAsWebInfResource("META-INF/" + databaseType + "-persistence.xml", "persistence.xml");
if (testInfo != null) {
for (Class<?> bean : testInfo.beans()) {
archive.addClass(bean);
}
}
if (testInfo == null || !testInfo.skipRegiJpa()) {
/*
* Ugly hack so that Hibernate will see the regiJPA entities.
* Hibernate looks at the real file system, based on the location of the persistence.xml file,
* so I have to "pollute" the test-classes folder with the entities
*/
final File[] files = mavenResolver.resolve("ca.ubc.sis:ubc-regiJPA").withoutTransitivity().as(File.class);
final File destinationDir = new File("target/test-classes");
for (final File file : files) {
final JavaArchive javaArchive = ShrinkWrap.createFromZipFile(JavaArchive.class, file);
javaArchive.as(ExplodedExporter.class).exportExploded(destinationDir, "");
}
}
/*
* final JavaArchive javaArchive = ShrinkWrap.create(JavaArchive.class);
* for (File file : files) {
* new ZipImporterImpl(javaArchive).importFrom(file);
*
* //final JavaArchive javaArchive = ShrinkWrap.createFromZipFile(JavaArchive.class, file);
* //archive.add(javaArchive, "WEB-INF/classes", StreamExporter.class);
* }
* archive.merge(javaArchive, "WEB-INF/classes");
* // System.out.println(javaArchive.toString(true));
* // archive.add(JavaArchive.class).add
* //archive.add(javaArchive, "WEB-INF/classes", ZipExporter.class);
* // archive.addAsLibraries(files);
*
*/
logger.debug(archive.toString(true));
return archive;
}
The unit test file looks like:
@ArquillianDerbyTestInfo(beans= {StudentSearchRepository.class})
@UsingDataSet({"ca/ubc/sis/services/sisrest/repository/jpa/IT_OamsStudentSearchRepository.xml"})
public class IT_StudentSearchRepository extends ArquillianDerbyTest {
@Deployment
public static Archive<?> deploy() {
return createDeploymentArchive(IT_StudentSearchRepository.class);
}
In the pom.xml I have:
<dependency>
<groupId>ca.ubc.sis</groupId>
<artifactId>ubc-regiJPA</artifactId>
<scope>compile</scope>
</dependency>
My project layout has:
src/test/resources/META-INF
services/
derby-persistence.xml
The persistence file looks like:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="ubcRegiDomain" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>java:jboss/datasource/ubcRegiDomainDS</jta-data-source>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.DerbyTenSevenDialect"/>
<property name="hibernate.show_sql" value="false"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.id.new_generator_mappings" value="true"/>
<property name="hibernate.hbm2ddl.import_files" value=""/>
<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
<property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform" />
</properties>
</persistence-unit>
</persistence>
When I run a test I see:
DEBUG 2016-03-17 11:35:16 ca.ubc.sis.test.arquillian.ArquillianDerbyTest:136 - test.war:
/WEB-INF/
/WEB-INF/classes/
/WEB-INF/classes/ca/
/WEB-INF/classes/ca/ubc/
/WEB-INF/classes/ca/ubc/sis/
/WEB-INF/classes/ca/ubc/sis/test/
/WEB-INF/classes/ca/ubc/sis/test/arquillian/
/WEB-INF/classes/ca/ubc/sis/test/arquillian/ArquillianDerbyTest.class
/WEB-INF/classes/ca/ubc/sis/test/arquillian/ArquillianDerbyTestBean.class
/WEB-INF/classes/ca/ubc/sis/test/arquillian/ArquillianDerbyTestInfo.class
/WEB-INF/classes/ca/ubc/sis/test/arquillian/DatabaseType.class
/WEB-INF/classes/ca/ubc/sis/services/
/WEB-INF/classes/ca/ubc/sis/services/sisrest/
/WEB-INF/classes/ca/ubc/sis/services/sisrest/repository/
/WEB-INF/classes/ca/ubc/sis/services/sisrest/repository/optimized/
/WEB-INF/classes/ca/ubc/sis/services/sisrest/repository/optimized/StudentSearchRepository.class
/WEB-INF/classes/ca/ubc/sis/services/sisrest/repository/optimized/StudentSearchRepository$1.class
/WEB-INF/classes/ca/ubc/sis/services/sisrest/repository/optimized/StudentSearchRepository$2.class
/WEB-INF/classes/ca/ubc/sis/services/sisrest/repository/optimized/StudentSearchRepository$3.class
/WEB-INF/classes/ca/ubc/sis/services/sisrest/repository/optimized/StudentSearchRepository$4.class
/WEB-INF/classes/ca/ubc/sis/services/sisrest/repository/optimized/StudentSearchRepository$StudentProgram.class
/WEB-INF/lib/
/WEB-INF/lib/mockito-all-2.0.2-beta.jar
/WEB-INF/resources.xml
/WEB-INF/beans.xml
/WEB-INF/persistence.xml
INFO 2016-03-17 11:35:21 org.hibernate.annotations.common.Version:37 - HCANN000001: Hibernate Commons Annotations {4.0.2.Final}
INFO 2016-03-17 11:35:21 org.hibernate.Version:41 - HHH000412: Hibernate Core {4.2.21.Final}
INFO 2016-03-17 11:35:21 org.hibernate.cfg.Environment:238 - HHH000206: hibernate.properties not found
INFO 2016-03-17 11:35:22 org.hibernate.cfg.Environment:345 - HHH000021: Bytecode provider name : javassist
DEBUG 2016-03-17 11:35:22 org.hibernate.ejb.Ejb3Configuration:529 - Processing PersistenceUnitInfo [
name: ubcRegiDomain
persistence provider classname: org.hibernate.ejb.HibernatePersistence
classloader: org.apache.openejb.arquillian.openejb.SWClassLoader@10afe71a
Temporary classloader: org.apache.openejb.core.TempClassLoader@7c8c70d6
excludeUnlistedClasses: false
JTA datasource: org.apache.openejb.resource.jdbc.dbcp.BasicManagedDataSource@6b3f6585
Non JTA datasource: org.apache.openejb.resource.jdbc.dbcp.BasicDataSource@1b5c3e5f
Transaction type: JTA
PU root URL: file:/W:/Perforce/lindholm/FEATURE_JAVA_JBOSS/sis/services/sisrest/sisrest-service-war/target/test-classes/
Shared Cache Mode: UNSPECIFIED
Validation Mode: AUTO
Jar files URLs []
Managed classes names []
Mapping files names []
Properties [
hibernate.id.new_generator_mappings: true
hibernate.dialect: org.hibernate.dialect.DerbyTenSevenDialect
hibernate.show_sql: false
hibernate.hbm2ddl.import_files:
hibernate.hbm2ddl.auto: update
hibernate.format_sql: true
hibernate.transaction.jta.platform: org.apache.openejb.hibernate.OpenEJBJtaPlatform]
DEBUG 2016-03-17 11:35:22 org.hibernate.ejb.Ejb3Configuration:852 - Detect class: true; detect hbm: true
DEBUG 2016-03-17 11:35:22 org.hibernate.ejb.Ejb3Configuration:852 - Detect class: true; detect hbm: true
DEBUG 2016-03-17 11:35:22 org.hibernate.ejb.packaging.AbstractJarVisitor:126 - Searching mapped entities in jar/par: file:/W:/Perforce/lindholm/FEATURE_JAVA_JBOSS/sis/services/sisrest/sisrest-service-war/target/test-classes/
Thanks