diff --git a/changelog.md b/changelog.md index 74d3c5cafd..a63c9d7504 100644 --- a/changelog.md +++ b/changelog.md @@ -4,7 +4,10 @@ ### Version 5.0.3 -* `webserver`: The `corda-webserver` component has been renamed to `corda-testserver.` +* `quasar-utils`: Add `excludeClassLoaders` option to the `quasar` extension. This option requires Quasar 0.7.12_r3 and above, excluding 0.8.0. + +* `cordformation`: The `corda-webserver` component has been renamed to `corda-testserver.` + * `jar-filter`: Support for byte-code compiled by Kotlin >= 1.3.40 (See [KT-30289](https://youtrack.jetbrains.com/issue/KT-30289)). ### Version 5.0.2 diff --git a/quasar-utils/src/main/groovy/net/corda/plugins/QuasarExtension.groovy b/quasar-utils/src/main/groovy/net/corda/plugins/QuasarExtension.groovy index e6a27b0a59..e83232409e 100644 --- a/quasar-utils/src/main/groovy/net/corda/plugins/QuasarExtension.groovy +++ b/quasar-utils/src/main/groovy/net/corda/plugins/QuasarExtension.groovy @@ -35,6 +35,7 @@ class QuasarExtension { * - debug * - verbose * - globs of packages not to instrument. + * - globs of classloaders not to instrument. */ final Property debug @@ -42,6 +43,8 @@ class QuasarExtension { final ListProperty excludePackages + final ListProperty excludeClassLoaders + @PackageScope final Provider options @@ -51,7 +54,8 @@ class QuasarExtension { String defaultGroup, String defaultVersion, String defaultClassifier, - Iterable initialExclusions + Iterable initialPackageExclusions, + Iterable initialClassLoaderExclusions ) { group = objects.property(String).convention(defaultGroup) version = objects.property(String).convention(defaultVersion) @@ -67,21 +71,28 @@ class QuasarExtension { debug = objects.property(Boolean).convention(false) verbose = objects.property(Boolean).convention(false) excludePackages = objects.listProperty(String) - excludePackages.set(initialExclusions) - options = excludePackages.flatMap { excludes -> - debug.flatMap { isDebug -> - verbose.map { isVerbose -> - def builder = new StringBuilder('=') - if (isDebug) { - builder.append('d') - } - if (isVerbose) { - builder.append('v') - } - if (!excludes.isEmpty()) { - builder.append('x(').append(excludes.join(';')).append(')') + excludePackages.set(initialPackageExclusions) + excludeClassLoaders = objects.listProperty(String) + excludeClassLoaders.set(initialClassLoaderExclusions) + options = excludePackages.flatMap { packages -> + excludeClassLoaders.flatMap { classLoaders -> + debug.flatMap { isDebug -> + verbose.map { isVerbose -> + def builder = new StringBuilder('=') + if (isDebug) { + builder.append('d') + } + if (isVerbose) { + builder.append('v') + } + if (!packages.isEmpty()) { + builder.append('x(').append(packages.join(';')).append(')') + } + if (!classLoaders.isEmpty()) { + builder.append('l(').append(classLoaders.join(';')).append(')') + } + builder.length() == 1 ? '' : builder.toString() } - builder.length() == 1 ? '' : builder.toString() } } } diff --git a/quasar-utils/src/main/groovy/net/corda/plugins/QuasarPlugin.groovy b/quasar-utils/src/main/groovy/net/corda/plugins/QuasarPlugin.groovy index 99d0659b11..8fe44c45d6 100644 --- a/quasar-utils/src/main/groovy/net/corda/plugins/QuasarPlugin.groovy +++ b/quasar-utils/src/main/groovy/net/corda/plugins/QuasarPlugin.groovy @@ -38,11 +38,16 @@ class QuasarPlugin implements Plugin { def quasarGroup = rootProject.hasProperty('quasar_group') ? rootProject.property('quasar_group') : defaultGroup def quasarVersion = rootProject.hasProperty('quasar_version') ? rootProject.property('quasar_version') : defaultVersion def quasarClassifier = rootProject.hasProperty('quasar_classifier') ? rootProject.property('quasar_classifier') : defaultClassifier - def quasarExclusions = rootProject.hasProperty("quasar_exclusions") ? rootProject.property('quasar_exclusions') : Collections.emptyList() - if (!(quasarExclusions instanceof Iterable)) { + def quasarPackageExclusions = rootProject.hasProperty("quasar_exclusions") ? rootProject.property('quasar_exclusions') : Collections.emptyList() + if (!(quasarPackageExclusions instanceof Iterable)) { throw new InvalidUserDataException("quasar_exclusions property must be an Iterable") } - def quasarExtension = project.extensions.create(QUASAR, QuasarExtension, objects, quasarGroup, quasarVersion, quasarClassifier, quasarExclusions) + def quasarClassLoaderExclusions = rootProject.hasProperty("quasar_classloader_exclusions") ? rootProject.property('quasar_classloader_exclusions') : Collections.emptyList() + if (!(quasarClassLoaderExclusions instanceof Iterable)) { + throw new InvalidUserDataException("quasar_classloader_exclusions property must be an Iterable") + } + def quasarExtension = project.extensions.create(QUASAR, QuasarExtension, objects, + quasarGroup, quasarVersion, quasarClassifier, quasarPackageExclusions, quasarClassLoaderExclusions) addQuasarDependencies(project, quasarExtension) configureQuasarTasks(project, quasarExtension) diff --git a/quasar-utils/src/test/groovy/net/corda/plugins/QuasarPluginTest.groovy b/quasar-utils/src/test/groovy/net/corda/plugins/QuasarPluginTest.groovy index 33feaab526..cb79392180 100644 --- a/quasar-utils/src/test/groovy/net/corda/plugins/QuasarPluginTest.groovy +++ b/quasar-utils/src/test/groovy/net/corda/plugins/QuasarPluginTest.groovy @@ -20,6 +20,7 @@ class QuasarPluginTest { @BeforeEach void setup() { + Utilities.installResource(testProjectDir, "gradle.properties") Utilities.installResource(testProjectDir, "settings.gradle") Utilities.installResource(testProjectDir, "repositories.gradle") Utilities.installResource(testProjectDir, "src/test/java/BasicTest.java") @@ -445,6 +446,41 @@ test { } } + @Test + void testExcludeClassLoaders() { + def output = runGradleFor """ +plugins { + id 'net.corda.plugins.quasar-utils' apply false +} +apply plugin: 'net.corda.plugins.quasar-utils' +apply from: 'repositories.gradle' + +dependencies { + testImplementation 'junit:junit:4.12' +} + +quasar { + version = '0.7.12_r3' + excludeClassLoaders = [ 'net.corda.**', 'org.testing.*' ] +} + +jar { + enabled = false +} + +test { + doLast { + allJvmArgs.forEach { + println "TEST-JVM: \${it}" + } + } +} +""", "test" + assertThat(output).anyMatch { + it.startsWith("TEST-JVM: -javaagent:") && it.endsWith('=l(net.corda.**;org.testing.*)') + } + } + private List runGradleFor(String script, String taskName) { def result = runnerFor(script, taskName).build() println result.output diff --git a/quasar-utils/src/test/resources/gradle.properties b/quasar-utils/src/test/resources/gradle.properties new file mode 100644 index 0000000000..e69de29bb2 diff --git a/quasar-utils/src/test/resources/repositories.gradle b/quasar-utils/src/test/resources/repositories.gradle index b965e9bb6e..c9e8bc8f12 100644 --- a/quasar-utils/src/test/resources/repositories.gradle +++ b/quasar-utils/src/test/resources/repositories.gradle @@ -1,3 +1,6 @@ repositories { mavenCentral() + maven { + url 'https://software.r3.com/artifactory/corda-dependencies' + } }