268 lines
9.7 KiB
Groovy
268 lines
9.7 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'
|
|
}
|
|
|
|
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
|
|
}
|
|
}
|
|
}
|
|
}
|