apply plugin: 'karaf-featuresgen' sourceSets { test { // send javac output and resource copying to the same output directory for test // so Pax Exam can more easily find it without explicit TinyBundle hooks output.classesDir = "${buildDir}/classes/test" output.resourcesDir = output.classesDir } } configurations { karafDistro { description = 'Configuration used to isolate the dependency on the Karaf distro' transitive = false } aries { description = 'Runtime dependencies for Aries for the hibernate-jpa-aries Karaf feature' } hibernateEntityManager { description = 'Used in Karaf feature generation to define the Hibernate JPA dependencies' transitive = false } } ext { // MUST use 4.3.1! 4.3.0 was compiled with "-target jsr14". // http://blog.osgi.org/2012/10/43-companion-code-for-java-7.html osgiCoreVersion = '4.3.1' karafVersion = '3.0.3' paxExamVersion = '4.4.0' paxUrlVersion = '2.4.1' } dependencies { ext { paxExamVersion = '4.4.0' paxExamUrlVersion = '2.4.1' karafVersion = '3.0.3' } compile( project( ':hibernate-core' ) ) compile( project( ':hibernate-entitymanager' ) ) // MUST use 4.3.1! 4.3.0 was compiled with "-target jsr14". // http://blog.osgi.org/2012/10/43-companion-code-for-java-7.html compile "org.osgi:org.osgi.core:${osgiCoreVersion}" compile "org.osgi:org.osgi.compendium:${osgiCoreVersion}" testCompile "org.ops4j.pax.exam:pax-exam:${paxExamVersion}" testCompile "org.ops4j.pax.exam:pax-exam-junit4:${paxExamVersion}" testCompile "org.ops4j.pax.exam:pax-exam-container-karaf:${paxExamVersion}" // Need this explicitly in order to use @Inject -> shouldn't this be a transtive dep of pax-exam? // is there ever a pax exam test that *does not* use this? testCompile 'javax.inject:javax.inject:1' testCompile( "org.apache.karaf:apache-karaf:${karafVersion}" ) { // having trouble finding this one locally exclude group: 'org.eclipse', module: 'org.eclipse.osgi' } karafDistro "org.apache.karaf:apache-karaf:${karafVersion}@tar.gz" aries 'org.apache.aries.transaction:org.apache.aries.transaction.blueprint:1.0.0' aries 'org.apache.aries.transaction:org.apache.aries.transaction.manager:1.0.1' } mavenPom { name = 'Hibernate OSGi Support' description = 'Support for running Hibernate O/RM in OSGi environments' } def osgiDescription() { return mavenPom.description } jar { manifest { instruction 'Bundle-Activator', 'org.hibernate.osgi.HibernateBundleActivator' instructionFirst 'Import-Package', // TODO: Shouldn't have to explicitly list this, but the plugin // generates it with a [1.0,2) version. 'javax.persistence;version="2.1.0"', 'javax.persistence.spi;version="2.1.0"' } } task generateVersionFile { File outputFileDir = project.file( "${buildDir}/classes/test/META-INF/hibernate-osgi/" ) File outputFile = new File( outputFileDir, 'Version.txt' ) inputs.property( "version", project.version ) outputs.file outputFile doFirst { outputFileDir.mkdirs() def writer = new FileWriter( outputFile ) try { writer.write( "${project.version}" ) writer.flush() } finally { writer.close() } } } karafFeatures { features { hibernateBase { name = 'hibernate-base' description = 'Isolates all Hibernate core dependencies into a single feature' projects = [ rootProject.childProjects.'hibernate-core', rootProject.childProjects.'hibernate-entitymanager', project ] bundle { match { group = 'org.jboss.logging' module = 'jboss-logging-annotations' } include = false } bundle { match group: 'org.jboss.logging', module: 'jboss-logging-processor' include = false } bundle { match group: 'antlr', module: 'antlr' remap group: 'org.apache.servicemix.bundles', module: 'org.apache.servicemix.bundles.antlr', version: '2.7.7_5' } bundle { match group: 'dom4j', module: 'dom4j' remap group: 'org.apache.servicemix.bundles', module: 'org.apache.servicemix.bundles.dom4j', version: '1.6.1_5' } } hibernateNative { name = 'hibernate-native' description = 'Defines support for using Hibernate native APIs (SessionFactory, Session) in user applications/bundles' dependencyFeatureNames = ['hibernate-base'] projects = [] } hibernateJpa { name = 'hibernate-jpa' description = 'Defines support for using Hibernate JPA implementation in user applications/bundles in an unmanaged manner' dependencyFeatureNames = ['hibernate-base'] projects = [] } hibernateJpaAries { name = 'hibernate-jpa-aries' description = 'Defines support for using Hibernate JPA implementation in user applications/bundles in an managed manner using Aries for OSGi JPA support' bundleDependencies = [project.configurations.aries] dependencyFeatureNames = ['hibernate-base'] projects = [] } // NOTE : would like to include spatial as well, but we need to wait for // it to not define dependency on postgresql driver hibernateEnvers { name = 'hibernate-envers' description = 'Feature for easily adding Envers support to hibernate-native, hibernate-jpa or hibernate-jpa-aries' dependencyFeatureNames = ['hibernate-base'] projects = [rootProject.childProjects.'hibernate-envers'] bundle { match group: 'org.hibernate', module: 'hibernate-core' include = false } bundle { match group: 'org.hibernate', module: 'hibernate-osgi' include = false } bundle { match group: 'org.hibernate', module: 'hibernate-entitymanager' include = false } bundle { match group: 'org.jboss.logging', module: 'jboss-logging' include = false } bundle { match group: 'org.jboss.logging', module: 'jboss-logging-annotations' include = false } bundle { match group: 'org.jboss.logging', module: 'jboss-logging-processor' include = false } } hibernateInfinispan { name = 'hibernate-infinispan' description = 'Feature for easily adding Infinispan-based caching support to hibernate-native, hibernate-jpa or hibernate-jpa-aries' dependencyFeatureNames = ['hibernate-base'] projects = [rootProject.childProjects.'hibernate-infinispan'] bundle { match group: 'org.hibernate', module: 'hibernate-core' include = false } bundle { match group: 'org.hibernate', module: 'hibernate-osgi' include = false } bundle { match group: 'org.jboss.logging', module: 'jboss-logging' include = false } bundle { match group: 'org.jboss.logging', module: 'jboss-logging-annotations' include = false } bundle { match group: 'org.jboss.logging', module: 'jboss-logging-processor' include = false } bundle { match group: 'org.jboss.spec.javax.transaction', module: 'jboss-transaction-api_1.1_spec' include = false } } hibernateEhcache { name = 'hibernate-ehcache' description = 'Feature for easily adding Ehcache-based caching support to hibernate-native, hibernate-jpa or hibernate-jpa-aries' dependencyFeatureNames = ['hibernate-base'] projects = [rootProject.childProjects.'hibernate-ehcache'] bundle { match group: 'org.hibernate', module: 'hibernate-core' include = false } bundle { match group: 'org.hibernate', module: 'hibernate-osgi' include = false } bundle { match group: 'org.jboss.logging', module: 'jboss-logging' include = false } bundle { match group: 'org.jboss.logging', module: 'jboss-logging-annotations' include = false } bundle { match group: 'org.jboss.logging', module: 'jboss-logging-processor' include = false } } } } task generateDependsFile { // In order to fully use org.ops4j.pax.exam.CoreOptions.maven() stuff // we need to generate a META-INF/maven/dependencies.properties file // just like the generate-depends-file Maven goal from ServiceMix/Karaf File outputFileDir = project.file( 'target/classes/test/META-INF/maven/' ) File outputFile = new File( outputFileDir, 'dependencies.properties' ) outputs.file outputFile doFirst { outputFileDir.mkdirs() Properties properties = new Properties(); // first we add our GAV info properties.setProperty( "groupId", "${project.group}" ); properties.setProperty( "artifactId", project.name ); properties.setProperty( "version", "${project.version}" ); properties.setProperty( "${project.group}/${project.name}/version", "${project.version}" ); // then for all our deps project.configurations.testRuntime.resolvedConfiguration.resolvedArtifacts.each { final String keyBase = it.moduleVersion.id.group + '/' + it.moduleVersion.id.name; properties.setProperty( "${keyBase}/scope", "compile" ) properties.setProperty( "${keyBase}/type", it.extension ) properties.setProperty( "${keyBase}/version", it.moduleVersion.id.version ) } FileOutputStream outputStream = new FileOutputStream( outputFile ); try { properties.store( outputStream, "Generated from Gradle by Hibernate build for PaxExam testing of hibernate-osgi module" ) } finally { outputStream.close() } } } task generatePaxExamEnvironmentFile { // I found this better/easier than duplicating information... description = 'Generates a Properties file that the Pax Exam test can access to know information about the test environment' File outputFile = new File( sourceSets.test.output.resourcesDir, 'pax-exam-environment.properties' ) File karafUnpackDirectory = file( "${buildDir}/karaf-unpack" ) // set up up-to-date checks inputs.files( configurations.testRuntime ) inputs.property( 'karafUnpackDirectory', karafUnpackDirectory ) outputs.file( outputFile ) doFirst { // should only be one artifacts.. File karafDistroFile = configurations.karafDistro.resolvedConfiguration.resolvedArtifacts[0].file Properties properties = new Properties(); properties.setProperty( 'org.ops4j.pax.exam.container.karaf.distroUrl', karafDistroFile.toURI().toURL().toExternalForm() ) properties.setProperty( 'org.ops4j.pax.exam.container.karaf.unpackDir', karafUnpackDirectory.absolutePath ) properties.setProperty( 'org.ops4j.pax.exam.container.karaf.version', karafVersion as String ) properties.setProperty( 'org.ops4j.pax.exam.container.karaf.probe.classesDir', sourceSets.test.output.classesDir.absolutePath ) properties.setProperty( 'org.ops4j.pax.exam.container.karaf.probe.resourcesDir', sourceSets.test.output.resourcesDir.absolutePath ) properties.setProperty( 'org.hibernate.osgi.test.karafFeatureFile', karafFeatures.featuresXmlFile.absolutePath ) outputFile.parentFile.mkdirs() FileOutputStream outputStream = new FileOutputStream( outputFile ); try { properties.store( outputStream, "Generated from Gradle by Hibernate build for PaxExam testing of hibernate-osgi module" ) } finally { outputStream.close() } } } tasks.test.dependsOn tasks.generateKarafFeatures tasks.test.dependsOn tasks.jar tasks.test.dependsOn tasks.generateDependsFile tasks.test.dependsOn tasks.generatePaxExamEnvironmentFile // we also need to make sure that core and HEM are published before running tests tasks.test.dependsOn rootProject.childProjects.'hibernate-core'.tasks.publishToMavenLocal tasks.test.dependsOn rootProject.childProjects.'hibernate-entitymanager'.tasks.publishToMavenLocal publishing { publications { mavenJava( MavenPublication ) { artifact( project.extensions.karafFeatures.featuresXmlFile ) { classifier 'karaf' } } } }