Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

buildSrc/test loads LibrariesForLibs twice from 2 different classloaders. #21637

Open
yogurtearl opened this issue Aug 24, 2022 · 0 comments
Open

Comments

@yogurtearl
Copy link
Contributor

yogurtearl commented Aug 24, 2022

When using to the work-around posted here:
#15383 (comment)

i.e.

./buildSrc/build.gradle.kts
plugins {
    `kotlin-dsl`
}

repositories {
    mavenCentral()
}

println("from build-src build script: ${libs.versions.bb.get()}")

dependencies {
    implementation(files(libs.javaClass.superclass.protectionDomain.codeSource.location))
}

./buildSrc/settings.gradle.kts
dependencyResolutionManagement {
    versionCatalogs {
        create("libs") {
            from(files("../gradle/libs.versions.toml"))
        }
    }
}

./buildSrc/src/main/kotlin/foo.gradle.kts
import org.gradle.accessors.dm.LibrariesForLibs

val libs = the<LibrariesForLibs>()
println("from pre compiled script plugin: ${libs.versions.bb.get()}")

./build.gradle.kts
plugins {
    id("foo")
}

println("from main build script: ${libs.versions.bb.get()}")

./gradle/libs.versions.toml
[versions]
bb = "3.2.1"

./settings.gradle.kts
rootProject.name = "showcase"

When that workaround is used with tests in buildSrc/test, then org.gradle.accessors.dm.LibrariesForLibs is loaded from 2 different class loaders:

VisitableURLClassLoader(ClassLoaderScopeIdentifier.Id{coreAndPlugins:injected-plugin(local)})

and

VisitableURLClassLoader(ClassLoaderScopeIdentifier.Id{coreAndPlugins:settings[:]:buildSrc[:](export)})

Expected Behavior

Should work with buildSrc/test with GradleRunner and withPluginClasspath

Current Behavior

but gives this error:

> Failed to apply plugin 'foo.bar'.
   > class org.gradle.accessors.dm.LibrariesForLibs_Decorated cannot be cast to class org.gradle.accessors.dm.LibrariesForLibs (org.gradle.accessors.dm.LibrariesForLibs_Decorated is in unnamed module of loader org.gradle.internal.classloader.VisitableURLClassLoader @30747123; org.gradle.accessors.dm.LibrariesForLibs is in unnamed module of loader org.gradle.internal.classloader.VisitableURLClassLoader @66bdd123)

Context

if I print the classloaders like this:

import org.gradle.accessors.dm.LibrariesForLibs


internal val Project.libs: LibrariesForLibs
    get() {
        printClassloader(libExtension().javaClass)
        printClassloader(libExtension().javaClass.superclass)
        printClassloader(LibrariesForLibs::class.java)
        return libExtension() as LibrariesForLibs
    }

private fun Project.libExtension(): Any = extensions.getByName("libs")

fun printClassloader(clazz: Class<*>) {
    println("class ${clazz.canonicalName} has CL ${clazz.classLoader}")
    println("location ${clazz.protectionDomain.codeSource.location}")

    var parent = clazz.classLoader.parent
    while(parent != null) {
        println("with parent $parent")
        parent = parent.parent
    }
}

I will print something like this:

> Configure project :foo:bar:whevs
class org.gradle.accessors.dm.LibrariesForLibs_Decorated has CL VisitableURLClassLoader(ClassLoaderScopeIdentifier.Id{coreAndPlugins:settings[:]:buildSrc[:](export)})
location file:/private/var/folders/zg/tjjb_fkx1355xx67t7pyl43r123/T/junit15680257868112259141/.gradle/7.5.1/dependencies-accessors/f5ba69d2465650fe8c727e76995fffc6234da247/classes/
with parent CachingClassLoader(FilteringClassLoader(VisitableURLClassLoader(legacy-mixin-loader)))
with parent FilteringClassLoader(VisitableURLClassLoader(legacy-mixin-loader))
with parent VisitableURLClassLoader(legacy-mixin-loader)
with parent VisitableURLClassLoader(ant-and-gradle-loader)
with parent VisitableURLClassLoader(ant-loader)
with parent jdk.internal.loader.ClassLoaders$PlatformClassLoader@4c180213
class org.gradle.accessors.dm.LibrariesForLibs has CL VisitableURLClassLoader(ClassLoaderScopeIdentifier.Id{coreAndPlugins:settings[:]:buildSrc[:](export)})
location file:/private/var/folders/zg/tjjb_fkx1355xx67t7pyl43r123/T/junit15680257868112259141/.gradle/7.5.1/dependencies-accessors/f5ba69d2465650fe8c727e76995fffc6234da247/classes/
with parent CachingClassLoader(FilteringClassLoader(VisitableURLClassLoader(legacy-mixin-loader)))
with parent FilteringClassLoader(VisitableURLClassLoader(legacy-mixin-loader))
with parent VisitableURLClassLoader(legacy-mixin-loader)
with parent VisitableURLClassLoader(ant-and-gradle-loader)
with parent VisitableURLClassLoader(ant-loader)
with parent jdk.internal.loader.ClassLoaders$PlatformClassLoader@4c180213
class org.gradle.accessors.dm.LibrariesForLibs has CL VisitableURLClassLoader(ClassLoaderScopeIdentifier.Id{coreAndPlugins:injected-plugin(local)})
location file:/Users/me/git/myproject/buildSrc/build/tmp/test/work/.gradle-test-kit/caches/jars-9/749352387bd7e916adb995fc3d840123/classes.jar
with parent CachingClassLoader(FilteringClassLoader(VisitableURLClassLoader(legacy-mixin-loader)))
with parent FilteringClassLoader(VisitableURLClassLoader(legacy-mixin-loader))
with parent VisitableURLClassLoader(legacy-mixin-loader)
with parent VisitableURLClassLoader(ant-and-gradle-loader)
with parent VisitableURLClassLoader(ant-loader)
with parent jdk.internal.loader.ClassLoaders$PlatformClassLoader@4c180213

Your Environment

Gradle 7.5.1

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants