hibernate-orm/hibernate-osgi/hibernate-osgi.gradle

269 lines
9.8 KiB
Groovy

/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
description = 'Support for running Hibernate O/RM in OSGi environments'
apply from: rootProject.file( 'gradle/published-java-module.gradle' )
apply plugin: 'com.github.lburgazzoli.karaf'
ext {
osgiCoreVersion = '6.0.0'
osgiCompediumVersion = '5.0.0'
karafVersion = '4.2.1'
paxExamVersion = '4.12.0'
}
/*
* With the current karaf/pax-exam versions and with JDK11.0.3,
* we get errors like "java.lang.IllegalStateException: Unknown protocol: jrt".
*
* This is suspiciously similar to the problems we had on Hibernate Search,
* and we gave up the idea of fixing those after a few hours.
*
* Copy-pasting the explanation from Search (not sure it applies here, but it's likely):
* > Upgrading to Karaf 4.2.5 fixes that, but then we get errors about "/karaf.log" not being accessible.
* > Upgrading once again to Pax-exam 4.13.1 fixes that, but then startup looks stuck at some point,
* > without any particular error even if we raise all the different log levels to "trace".
* > Upgrading pax-url to 2.6.1 to be in line with the versions in the Karaf pom doesn't change anything.
* > Strangely, with these upgrades, everything still works fine with JDK8,
* > but we get in trouble with JDK11.0.0 and above.
* > A bit ironic since the problems we were trying to solve initially only affected JDK11.0.3,
* > not JDK11.0.0.
*/
if ( gradle.ext.javaVersions.test.launcher.asInt() >= 11 ) {
logger.warn( '[WARN] Skipping all tests for hibernate-osgi due to Karaf/Pax-Exam issues with latest JDK 11' )
test.enabled = false
}
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
java.outputDir = file( "${buildDir}/classes/test" )
output.resourcesDir = java.outputDir
}
}
configurations {
karafDistro {
description = 'Configuration used to isolate the dependency on the Karaf distro'
transitive = false
}
hibernateEnvers {
description = 'Feature for easily adding Envers support to hibernate-orm'
transitive = false
}
}
dependencies {
compile( project( ':hibernate-core' ) ) {
// having javax.activation-api as a dependency requires us to have com.sun.activation:javax.activation
// this dependency wasn't there in the 5.2.x bundles so ignoring it for now
// we might reintroduce it at some point if users complain about it
exclude module: 'javax.activation-api'
// JAXB is included in the Karaf distribution
exclude module: 'jaxb-api'
exclude module: 'jaxb-runtime'
}
testCompile( project( ':hibernate-envers' ) )
compile "org.osgi:org.osgi.core:${osgiCoreVersion}"
compile "org.osgi:org.osgi.compendium:${osgiCompediumVersion}"
compile "net.bytebuddy:byte-buddy:${byteBuddyVersion}"
// Needed by JBoss JTA
runtime( libraries.interceptor )
testCompile "org.ops4j.pax.exam:pax-exam:${project.paxExamVersion}"
testCompile "org.ops4j.pax.exam:pax-exam-junit4:${project.paxExamVersion}"
testCompile "org.ops4j.pax.exam:pax-exam-container-karaf:${project.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:${project.karafVersion}" ) {
// having trouble finding this one locally
exclude group: 'org.eclipse', module: 'org.eclipse.osgi'
exclude group: 'org.hibernate', module: 'hibernate-osgi'
}
karafDistro "org.apache.karaf:apache-karaf:${project.karafVersion}@tar.gz"
hibernateEnvers( project( ':hibernate-envers' ) )
}
jar {
manifest {
attributes(
// BND Plugin instructions (for OSGi):
'Bundle-Activator': 'org.hibernate.osgi.HibernateBundleActivator',
'Provide-Capability': 'osgi.service;effective:=active;objectClass=javax.persistence.spi.PersistenceProvider',
'Import-Package': [
// TODO: Shouldn't have to explicitly list this, but the plugin
// generates it with a [1.0,2) version.
"javax.persistence;version=\"${project.jpaVersion.osgiName}\"",
"javax.persistence.spi;version=\"${project.jpaVersion.osgiName}\"",
// Temporarily support JTA 1.1 -- Karaf and other frameworks still
// use it. Without this, the plugin generates [1.2,2).
'javax.transaction;version="[1.1,2)"',
// Also import every package referenced in the code
'*'
].join( ',' )
)
}
}
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()
}
}
}
karaf {
features {
xsdVersion = '1.4.0'
feature {
name = 'hibernate-orm'
description = 'Combines all Hibernate core dependencies and required modules into a single feature'
includeProject = true
feature ('wrap') {
prerequisite = true
}
feature 'transaction-api'
// Most Hibernate modules declare OSGi metadata through blueprints, so we need this feature
feature 'aries-blueprint'
}
// NOTE : would like to include spatial as well, but we need to wait for
// it to not define dependency on postgresql driver
feature {
name = 'hibernate-envers'
description = 'Feature for easily adding Envers support to hibernate-orm'
includeProject = false
configurations 'hibernateEnvers'
feature('hibernate-orm') {
version = project.version
}
}
// The hibernate-infinispan feature is now provided by the Infinispan project.
}
}
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.java.outputDir.absolutePath )
properties.setProperty( 'org.ops4j.pax.exam.container.karaf.probe.resourcesDir', sourceSets.test.output.resourcesDir.absolutePath )
properties.setProperty( 'org.hibernate.osgi.test.karafFeatureFile', karaf.features.outputFile.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.generateFeatures
tasks.test.dependsOn tasks.jar
tasks.test.dependsOn tasks.generateDependsFile
tasks.test.dependsOn tasks.generatePaxExamEnvironmentFile
// we also need to make sure that hibernate-core, hibernate-entitymanager and hibernate-osgi
// are published to maven-local before running tests
tasks.test.dependsOn rootProject.childProjects.'hibernate-core'.tasks.publishToMavenLocal
tasks.test.dependsOn rootProject.childProjects.'hibernate-envers'.tasks.publishToMavenLocal
tasks.test.dependsOn tasks.publishToMavenLocal
publishing {
publications {
publishedArtifacts( MavenPublication ) {
artifact( project.extensions.karaf.features.outputFile ) {
classifier 'karaf'
builtBy generateFeatures
}
}
}
}