From 8474babb73242a56c806f312089364d06a88c4c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=B3r=C3=A1nt=20Pint=C3=A9r?= Date: Thu, 13 Feb 2025 09:38:08 +0100 Subject: [PATCH 1/3] Add new :classloaders subproject --- .teamcity/subprojects.json | 7 ++++ .../base-services/build.gradle.kts | 7 ++-- .../classloaders/build.gradle.kts | 39 +++++++++++++++++++ settings.gradle.kts | 1 + .../child/WorkerProcessClassPathProvider.java | 1 + .../gradle/DistributionIntegrationSpec.groovy | 1 + 6 files changed, 53 insertions(+), 3 deletions(-) create mode 100644 platforms/core-runtime/classloaders/build.gradle.kts diff --git a/.teamcity/subprojects.json b/.teamcity/subprojects.json index a763ef32971f4..a6f5d1737098e 100644 --- a/.teamcity/subprojects.json +++ b/.teamcity/subprojects.json @@ -188,6 +188,13 @@ "functionalTests": false, "crossVersionTests": false }, + { + "name": "classloaders", + "path": "platforms/core-runtime/classloaders", + "unitTests": false, + "functionalTests": false, + "crossVersionTests": false + }, { "name": "cli", "path": "platforms/core-runtime/cli", diff --git a/platforms/core-runtime/base-services/build.gradle.kts b/platforms/core-runtime/base-services/build.gradle.kts index 3488dde3f9d84..5bc12891eba09 100644 --- a/platforms/core-runtime/base-services/build.gradle.kts +++ b/platforms/core-runtime/base-services/build.gradle.kts @@ -30,12 +30,13 @@ tasks.named("jmhCompileGeneratedClasses") { moduleIdentity.createBuildReceipt() dependencies { + api(projects.buildOperations) + api(projects.classloaders) api(projects.concurrent) - api(projects.stdlibJavaExtensions) api(projects.fileTemp) - api(projects.serviceLookup) api(projects.hashing) - api(projects.buildOperations) + api(projects.serviceLookup) + api(projects.stdlibJavaExtensions) api(libs.inject) api(libs.jsr305) api(libs.guava) diff --git a/platforms/core-runtime/classloaders/build.gradle.kts b/platforms/core-runtime/classloaders/build.gradle.kts new file mode 100644 index 0000000000000..2997909998853 --- /dev/null +++ b/platforms/core-runtime/classloaders/build.gradle.kts @@ -0,0 +1,39 @@ +/* + * Copyright 2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +plugins { + id("gradlebuild.distribution.implementation-java") +} + +description = "Tools to handle classloaders" + +gradlebuildJava.usedInWorkers() + +dependencies { + api(projects.hashing) + api(projects.stdlibJavaExtensions) + + api(libs.guava) + api(libs.jsr305) + + implementation(projects.io) + + implementation(libs.fastutil) + implementation(libs.kryo) + implementation(libs.slf4jApi) + + compileOnly(libs.errorProneAnnotations) +} diff --git a/settings.gradle.kts b/settings.gradle.kts index 05b0527c1f33c..4d5ec7410e2b1 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -80,6 +80,7 @@ val core = platform("core") { subproject("build-process-services") subproject("build-profile") subproject("build-state") + subproject("classloaders") subproject("cli") subproject("client-services") subproject("concurrent") diff --git a/subprojects/core/src/main/java/org/gradle/process/internal/worker/child/WorkerProcessClassPathProvider.java b/subprojects/core/src/main/java/org/gradle/process/internal/worker/child/WorkerProcessClassPathProvider.java index 078dd441b7bbf..ec6d1f9ceb81b 100644 --- a/subprojects/core/src/main/java/org/gradle/process/internal/worker/child/WorkerProcessClassPathProvider.java +++ b/subprojects/core/src/main/java/org/gradle/process/internal/worker/child/WorkerProcessClassPathProvider.java @@ -88,6 +88,7 @@ public class WorkerProcessClassPathProvider implements ClassPathProvider { "gradle-base-services", "gradle-enterprise-logging", "gradle-enterprise-workers", + "gradle-classloaders", "gradle-cli", "gradle-concurrent", "gradle-functional", diff --git a/testing/distributions-integ-tests/src/integTest/groovy/org/gradle/DistributionIntegrationSpec.groovy b/testing/distributions-integ-tests/src/integTest/groovy/org/gradle/DistributionIntegrationSpec.groovy index 6c1adaef823cc..dfd3c35ff04b1 100644 --- a/testing/distributions-integ-tests/src/integTest/groovy/org/gradle/DistributionIntegrationSpec.groovy +++ b/testing/distributions-integ-tests/src/integTest/groovy/org/gradle/DistributionIntegrationSpec.groovy @@ -58,6 +58,7 @@ abstract class DistributionIntegrationSpec extends AbstractIntegrationSpec { "build-option", "build-process-services", "build-state", + "classloaders", "cli", "client-services", "concurrent", From fc411444bdd40d6e6c34be38c83ffb406004b8d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=B3r=C3=A1nt=20Pint=C3=A9r?= Date: Thu, 13 Feb 2025 10:35:16 +0100 Subject: [PATCH 2/3] Move classloader-related classes to the new subproject --- .../internal/DefaultClassPathProvider.java | 1 + .../classloaders/build.gradle.kts | 4 + .../classloader/CachingClassLoader.java | 1 + .../classloader/ClassLoaderFactory.java | 0 .../classloader/ClassLoaderHierarchy.java | 0 .../internal/classloader/ClassLoaderSpec.java | 0 .../classloader/ClassLoaderUtils.java | 0 .../classloader/ClassLoaderVisitor.java | 0 .../internal/classloader/ClasspathHasher.java | 0 .../internal/classloader/ClasspathUtil.java | 0 ...onfigurableClassLoaderHierarchyHasher.java | 0 .../classloader/DelegatingClassLoader.java | 0 .../classloader/FilteringClassLoader.java | 132 +++++++++++++++++- .../HashingClassLoaderFactory.java | 0 .../classloader/ImplementationHashAware.java | 0 .../classloader/InstrumentingClassLoader.java | 0 .../internal/classloader/JarCompat.java | 0 .../classloader/MultiParentClassLoader.java | 0 .../classloader/SystemClassLoaderSpec.java | 0 .../classloader/TransformErrorHandler.java | 0 .../classloader/TransformReplacer.java | 10 +- .../classloader/TransformingClassLoader.java | 0 .../classloader/VisitableURLClassLoader.java | 6 +- .../internal/classloader/package-info.java | 0 .../gradle/internal/classpath/ClassPath.java | 0 .../internal/classpath/DefaultClassPath.java | 8 +- .../classpath/TransformedClassPath.java | 0 .../core-runtime/daemon-main/build.gradle.kts | 1 + .../gradle-cli-main/build.gradle.kts | 1 + ...dleRunnerMiscEndUserIntegrationTest.groovy | 1 + .../detection/ForkedTestClasspathFactory.java | 1 + 31 files changed, 154 insertions(+), 12 deletions(-) rename platforms/core-runtime/{base-services => classloaders}/src/main/java/org/gradle/internal/classloader/CachingClassLoader.java (99%) rename platforms/core-runtime/{base-services => classloaders}/src/main/java/org/gradle/internal/classloader/ClassLoaderFactory.java (100%) rename platforms/core-runtime/{base-services => classloaders}/src/main/java/org/gradle/internal/classloader/ClassLoaderHierarchy.java (100%) rename platforms/core-runtime/{base-services => classloaders}/src/main/java/org/gradle/internal/classloader/ClassLoaderSpec.java (100%) rename platforms/core-runtime/{base-services => classloaders}/src/main/java/org/gradle/internal/classloader/ClassLoaderUtils.java (100%) rename platforms/core-runtime/{base-services => classloaders}/src/main/java/org/gradle/internal/classloader/ClassLoaderVisitor.java (100%) rename platforms/core-runtime/{base-services => classloaders}/src/main/java/org/gradle/internal/classloader/ClasspathHasher.java (100%) rename platforms/core-runtime/{base-services => classloaders}/src/main/java/org/gradle/internal/classloader/ClasspathUtil.java (100%) rename platforms/core-runtime/{base-services => classloaders}/src/main/java/org/gradle/internal/classloader/ConfigurableClassLoaderHierarchyHasher.java (100%) rename platforms/core-runtime/{base-services => classloaders}/src/main/java/org/gradle/internal/classloader/DelegatingClassLoader.java (100%) rename platforms/core-runtime/{base-services => classloaders}/src/main/java/org/gradle/internal/classloader/FilteringClassLoader.java (75%) rename platforms/core-runtime/{base-services => classloaders}/src/main/java/org/gradle/internal/classloader/HashingClassLoaderFactory.java (100%) rename platforms/core-runtime/{base-services => classloaders}/src/main/java/org/gradle/internal/classloader/ImplementationHashAware.java (100%) rename platforms/core-runtime/{base-services => classloaders}/src/main/java/org/gradle/internal/classloader/InstrumentingClassLoader.java (100%) rename platforms/core-runtime/{base-services => classloaders}/src/main/java/org/gradle/internal/classloader/JarCompat.java (100%) rename platforms/core-runtime/{base-services => classloaders}/src/main/java/org/gradle/internal/classloader/MultiParentClassLoader.java (100%) rename platforms/core-runtime/{base-services => classloaders}/src/main/java/org/gradle/internal/classloader/SystemClassLoaderSpec.java (100%) rename platforms/core-runtime/{base-services => classloaders}/src/main/java/org/gradle/internal/classloader/TransformErrorHandler.java (100%) rename platforms/core-runtime/{base-services => classloaders}/src/main/java/org/gradle/internal/classloader/TransformReplacer.java (98%) rename platforms/core-runtime/{base-services => classloaders}/src/main/java/org/gradle/internal/classloader/TransformingClassLoader.java (100%) rename platforms/core-runtime/{base-services => classloaders}/src/main/java/org/gradle/internal/classloader/VisitableURLClassLoader.java (97%) rename platforms/core-runtime/{base-services => classloaders}/src/main/java/org/gradle/internal/classloader/package-info.java (100%) rename platforms/core-runtime/{base-services => classloaders}/src/main/java/org/gradle/internal/classpath/ClassPath.java (100%) rename platforms/core-runtime/{base-services => classloaders}/src/main/java/org/gradle/internal/classpath/DefaultClassPath.java (98%) rename platforms/core-runtime/{base-services => classloaders}/src/main/java/org/gradle/internal/classpath/TransformedClassPath.java (100%) diff --git a/platforms/core-runtime/build-process-services/src/main/java/org/gradle/api/internal/DefaultClassPathProvider.java b/platforms/core-runtime/build-process-services/src/main/java/org/gradle/api/internal/DefaultClassPathProvider.java index 104b5099e3b44..526cd9f2c8dfa 100644 --- a/platforms/core-runtime/build-process-services/src/main/java/org/gradle/api/internal/DefaultClassPathProvider.java +++ b/platforms/core-runtime/build-process-services/src/main/java/org/gradle/api/internal/DefaultClassPathProvider.java @@ -52,6 +52,7 @@ public ClassPath findClassPath(String name) { if (name.equals("DEPENDENCIES-EXTENSION-COMPILER")) { ClassPath classpath = ClassPath.EMPTY; classpath = classpath.plus(moduleRegistry.getModule("gradle-base-services").getImplementationClasspath()); + classpath = classpath.plus(moduleRegistry.getModule("gradle-classloaders").getImplementationClasspath()); classpath = classpath.plus(moduleRegistry.getModule("gradle-core-api").getImplementationClasspath()); classpath = classpath.plus(moduleRegistry.getModule("gradle-core").getImplementationClasspath()); classpath = classpath.plus(moduleRegistry.getModule("gradle-stdlib-java-extensions").getImplementationClasspath()); diff --git a/platforms/core-runtime/classloaders/build.gradle.kts b/platforms/core-runtime/classloaders/build.gradle.kts index 2997909998853..46ead4f657242 100644 --- a/platforms/core-runtime/classloaders/build.gradle.kts +++ b/platforms/core-runtime/classloaders/build.gradle.kts @@ -29,8 +29,12 @@ dependencies { api(libs.guava) api(libs.jsr305) + implementation(projects.baseAsm) + implementation(projects.concurrent) implementation(projects.io) + implementation(libs.commonsIo) + implementation(libs.commonsLang) implementation(libs.fastutil) implementation(libs.kryo) implementation(libs.slf4jApi) diff --git a/platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classloader/CachingClassLoader.java b/platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classloader/CachingClassLoader.java similarity index 99% rename from platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classloader/CachingClassLoader.java rename to platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classloader/CachingClassLoader.java index c4ccc35e8beae..4226c91096be4 100644 --- a/platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classloader/CachingClassLoader.java +++ b/platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classloader/CachingClassLoader.java @@ -32,6 +32,7 @@ public class CachingClassLoader extends ClassLoader implements DelegatingClassLo static { try { + //noinspection Since15 ClassLoader.registerAsParallelCapable(); } catch (NoSuchMethodError ignore) { // Not supported on Java 6 diff --git a/platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classloader/ClassLoaderFactory.java b/platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classloader/ClassLoaderFactory.java similarity index 100% rename from platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classloader/ClassLoaderFactory.java rename to platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classloader/ClassLoaderFactory.java diff --git a/platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classloader/ClassLoaderHierarchy.java b/platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classloader/ClassLoaderHierarchy.java similarity index 100% rename from platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classloader/ClassLoaderHierarchy.java rename to platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classloader/ClassLoaderHierarchy.java diff --git a/platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classloader/ClassLoaderSpec.java b/platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classloader/ClassLoaderSpec.java similarity index 100% rename from platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classloader/ClassLoaderSpec.java rename to platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classloader/ClassLoaderSpec.java diff --git a/platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classloader/ClassLoaderUtils.java b/platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classloader/ClassLoaderUtils.java similarity index 100% rename from platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classloader/ClassLoaderUtils.java rename to platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classloader/ClassLoaderUtils.java diff --git a/platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classloader/ClassLoaderVisitor.java b/platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classloader/ClassLoaderVisitor.java similarity index 100% rename from platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classloader/ClassLoaderVisitor.java rename to platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classloader/ClassLoaderVisitor.java diff --git a/platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classloader/ClasspathHasher.java b/platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classloader/ClasspathHasher.java similarity index 100% rename from platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classloader/ClasspathHasher.java rename to platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classloader/ClasspathHasher.java diff --git a/platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classloader/ClasspathUtil.java b/platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classloader/ClasspathUtil.java similarity index 100% rename from platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classloader/ClasspathUtil.java rename to platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classloader/ClasspathUtil.java diff --git a/platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classloader/ConfigurableClassLoaderHierarchyHasher.java b/platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classloader/ConfigurableClassLoaderHierarchyHasher.java similarity index 100% rename from platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classloader/ConfigurableClassLoaderHierarchyHasher.java rename to platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classloader/ConfigurableClassLoaderHierarchyHasher.java diff --git a/platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classloader/DelegatingClassLoader.java b/platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classloader/DelegatingClassLoader.java similarity index 100% rename from platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classloader/DelegatingClassLoader.java rename to platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classloader/DelegatingClassLoader.java diff --git a/platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classloader/FilteringClassLoader.java b/platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classloader/FilteringClassLoader.java similarity index 75% rename from platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classloader/FilteringClassLoader.java rename to platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classloader/FilteringClassLoader.java index bf21d6cf46b8d..bf699cdac2e58 100644 --- a/platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classloader/FilteringClassLoader.java +++ b/platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classloader/FilteringClassLoader.java @@ -16,13 +16,12 @@ package org.gradle.internal.classloader; -import org.gradle.internal.util.Trie; - import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.io.IOException; import java.net.URL; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Enumeration; import java.util.HashSet; @@ -52,6 +51,7 @@ public class FilteringClassLoader extends ClassLoader implements ClassLoaderHier SYSTEM_PACKAGES.add(p.getName()); } try { + //noinspection Since15 ClassLoader.registerAsParallelCapable(); } catch (NoSuchMethodError ignore) { // Not supported on Java 6 @@ -181,7 +181,7 @@ private boolean classAllowed(String className) { || (packagePrefixes.contains(DEFAULT_PACKAGE + ".") && isInDefaultPackage(className)); } - private boolean isInDefaultPackage(String className) { + private static boolean isInDefaultPackage(String className) { return !className.contains("."); } @@ -378,4 +378,130 @@ public Iterator iterator() { return set.iterator(); } } + + /** + * Move the Trie class in :base-services to :functional once we can use Java 8 and delete this class. + */ + private static class Trie implements Comparable { + private final char chr; + private final boolean terminal; + private final Trie[] transitions; + + public static Trie from(Iterable words) { + Builder builder = new Builder(); + for (String word : words) { + builder.addWord(word); + } + return builder.build(); + } + + private Trie(char chr, boolean terminal, Trie[] transitions) { + this.chr = chr; + this.terminal = terminal; + this.transitions = transitions; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(chr).append(terminal ? "(terminal)\n" : "\n"); + sb.append("Next: "); + for (Trie transition : transitions) { + sb.append(transition.chr).append(" "); + } + sb.append("\n"); + return sb.toString(); + } + + @Override + public int compareTo(@Nonnull Trie o) { + return chr - o.chr; + } + + /** + * Checks if the trie contains the given character sequence or any prefixes of the sequence. + */ + public boolean find(CharSequence seq) { + if (seq.length() == 0) { + return false; + } + int idx = 0; + Trie cur = this; + while (idx < seq.length()) { + char c = seq.charAt(idx); + boolean found = false; + for (Trie transition : cur.transitions) { + if (transition.chr == c) { + cur = transition; + idx++; + found = true; + if (idx == seq.length()) { + return cur.terminal; + } + break; + } else if (transition.chr > c) { + return false; + } + } + if (!found) { + return cur.terminal; + } + } + return cur.terminal; + } + + public static class Builder { + private final char chr; + private final List transitions = new ArrayList(); + + private boolean terminal; + + public Builder() { + chr = '\0'; + } + + private Builder(char chr) { + this.chr = chr; + } + + private Builder addTransition(char c, boolean terminal) { + Builder b = null; + for (Builder transition : transitions) { + if (transition.chr == c) { + b = transition; + break; + } + } + if (b == null) { + b = new Builder(c); + transitions.add(b); + } + b.terminal |= terminal; + return b; + } + + public void addWord(String word) { + Trie.Builder cur = this; + char[] chars = word.toCharArray(); + for (int i = 0; i < chars.length; i++) { + char c = chars[i]; + cur = cur.addTransition(c, i == chars.length - 1); + } + } + + public Trie build() { + Trie[] transitions = new Trie[this.transitions.size()]; + for (int i = 0; i < this.transitions.size(); i++) { + Builder transition = this.transitions.get(i); + transitions[i] = transition.build(); + } + Arrays.sort(transitions); + return new Trie(chr, terminal, transitions); + } + } + } + + interface Action { + void execute(T target); + } } diff --git a/platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classloader/HashingClassLoaderFactory.java b/platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classloader/HashingClassLoaderFactory.java similarity index 100% rename from platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classloader/HashingClassLoaderFactory.java rename to platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classloader/HashingClassLoaderFactory.java diff --git a/platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classloader/ImplementationHashAware.java b/platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classloader/ImplementationHashAware.java similarity index 100% rename from platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classloader/ImplementationHashAware.java rename to platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classloader/ImplementationHashAware.java diff --git a/platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classloader/InstrumentingClassLoader.java b/platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classloader/InstrumentingClassLoader.java similarity index 100% rename from platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classloader/InstrumentingClassLoader.java rename to platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classloader/InstrumentingClassLoader.java diff --git a/platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classloader/JarCompat.java b/platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classloader/JarCompat.java similarity index 100% rename from platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classloader/JarCompat.java rename to platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classloader/JarCompat.java diff --git a/platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classloader/MultiParentClassLoader.java b/platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classloader/MultiParentClassLoader.java similarity index 100% rename from platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classloader/MultiParentClassLoader.java rename to platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classloader/MultiParentClassLoader.java diff --git a/platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classloader/SystemClassLoaderSpec.java b/platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classloader/SystemClassLoaderSpec.java similarity index 100% rename from platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classloader/SystemClassLoaderSpec.java rename to platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classloader/SystemClassLoaderSpec.java diff --git a/platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classloader/TransformErrorHandler.java b/platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classloader/TransformErrorHandler.java similarity index 100% rename from platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classloader/TransformErrorHandler.java rename to platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classloader/TransformErrorHandler.java diff --git a/platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classloader/TransformReplacer.java b/platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classloader/TransformReplacer.java similarity index 98% rename from platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classloader/TransformReplacer.java rename to platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classloader/TransformReplacer.java index 073816e8a4284..9c71816a6ada0 100644 --- a/platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classloader/TransformReplacer.java +++ b/platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classloader/TransformReplacer.java @@ -16,9 +16,9 @@ package org.gradle.internal.classloader; +import org.apache.commons.io.IOUtils; import org.gradle.api.GradleException; import org.gradle.api.UncheckedIOException; -import org.gradle.internal.IoActions; import org.gradle.internal.classpath.TransformedClassPath; import org.gradle.internal.io.StreamByteBuffer; import org.gradle.model.internal.asm.AsmConstants; @@ -90,7 +90,7 @@ private Loader getLoader(ProtectionDomain domain) { // This replacer was closed while setting up a loader. // The transformLoader might be inserted into the loaders map after close(), so let's close it for sure to // avoid leaks. - IoActions.closeQuietly(transformLoader); + IOUtils.closeQuietly(transformLoader); // Throw the exception so the caller doesn't see the obviously closed loader. ensureOpened(); } @@ -115,7 +115,7 @@ private Loader storeIfAbsent(ProtectionDomain domain, Loader newLoader) { Loader oldLoader = loaders.putIfAbsent(domain, newLoader); if (oldLoader != null) { // Discard the new loader, someone beat us with storing it. - IoActions.closeQuietly(newLoader); + IOUtils.closeQuietly(newLoader); return oldLoader; } return newLoader; @@ -129,7 +129,7 @@ public void close() { } closed = true; for (Loader value : loaders.values()) { - IoActions.closeQuietly(value); + IOUtils.closeQuietly(value); } } @@ -198,7 +198,7 @@ public synchronized byte[] loadTransformedClass(String className) throws IOExcep @Override public synchronized void close() { // Not calling getJarFileLocked intentionally, to avoid opening the JAR if it isn't opened yet. - IoActions.closeQuietly(jarFile); + IOUtils.closeQuietly(jarFile); } private JarFile getJarFileLocked() throws IOException { diff --git a/platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classloader/TransformingClassLoader.java b/platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classloader/TransformingClassLoader.java similarity index 100% rename from platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classloader/TransformingClassLoader.java rename to platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classloader/TransformingClassLoader.java diff --git a/platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classloader/VisitableURLClassLoader.java b/platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classloader/VisitableURLClassLoader.java similarity index 97% rename from platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classloader/VisitableURLClassLoader.java rename to platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classloader/VisitableURLClassLoader.java index 40dd8bd7ec597..43d02a6e1b458 100644 --- a/platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classloader/VisitableURLClassLoader.java +++ b/platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classloader/VisitableURLClassLoader.java @@ -16,9 +16,9 @@ package org.gradle.internal.classloader; +import org.apache.commons.io.IOUtils; import org.gradle.internal.Cast; import org.gradle.internal.Factory; -import org.gradle.internal.IoActions; import org.gradle.internal.classpath.ClassPath; import org.gradle.internal.classpath.TransformedClassPath; @@ -36,6 +36,7 @@ public class VisitableURLClassLoader extends URLClassLoader implements ClassLoaderHierarchy { static { try { + //noinspection Since15 ClassLoader.registerAsParallelCapable(); } catch (NoSuchMethodError ignore) { // Not supported on Java 6 @@ -154,6 +155,7 @@ private static class InstrumentingVisitableURLClassLoader extends VisitableURLCl static { try { // Not supported on Java 6, hence the try-catch + //noinspection Since15 ClassLoader.registerAsParallelCapable(); } catch (NoSuchMethodError ignore) { // ignore in Java 6 @@ -194,7 +196,7 @@ protected Class findClass(String name) throws ClassNotFoundException { @Override public void close() throws IOException { - IoActions.closeQuietly(replacer); + IOUtils.closeQuietly(replacer); super.close(); } } diff --git a/platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classloader/package-info.java b/platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classloader/package-info.java similarity index 100% rename from platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classloader/package-info.java rename to platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classloader/package-info.java diff --git a/platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classpath/ClassPath.java b/platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classpath/ClassPath.java similarity index 100% rename from platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classpath/ClassPath.java rename to platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classpath/ClassPath.java diff --git a/platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classpath/DefaultClassPath.java b/platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classpath/DefaultClassPath.java similarity index 98% rename from platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classpath/DefaultClassPath.java rename to platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classpath/DefaultClassPath.java index 5e2fba76858d0..2052ad0852601 100644 --- a/platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classpath/DefaultClassPath.java +++ b/platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classpath/DefaultClassPath.java @@ -16,7 +16,6 @@ package org.gradle.internal.classpath; -import org.gradle.api.specs.NotSpec; import org.gradle.api.specs.Spec; import org.gradle.internal.Cast; import org.gradle.internal.UncheckedException; @@ -165,7 +164,12 @@ public ClassPath plus(Collection other) { @Override public ClassPath removeIf(final Spec filter) { - List remainingFiles = CollectionUtils.filter(files, new NotSpec(filter)); + List remainingFiles = CollectionUtils.filter(files, new Spec() { + @Override + public boolean isSatisfiedBy(File element) { + return !filter.isSatisfiedBy(element); + } + }); if (remainingFiles.size() == files.size()) { return this; } diff --git a/platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classpath/TransformedClassPath.java b/platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classpath/TransformedClassPath.java similarity index 100% rename from platforms/core-runtime/base-services/src/main/java/org/gradle/internal/classpath/TransformedClassPath.java rename to platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classpath/TransformedClassPath.java diff --git a/platforms/core-runtime/daemon-main/build.gradle.kts b/platforms/core-runtime/daemon-main/build.gradle.kts index 3e3e75406f636..01b71f89ceb82 100644 --- a/platforms/core-runtime/daemon-main/build.gradle.kts +++ b/platforms/core-runtime/daemon-main/build.gradle.kts @@ -31,6 +31,7 @@ dependencies { manifestClasspath(projects.stdlibJavaExtensions) manifestClasspath(projects.buildProcessServices) manifestClasspath(projects.baseServices) + manifestClasspath(projects.classloaders) manifestClasspath(projects.concurrent) manifestClasspath(projects.serviceLookup) } diff --git a/platforms/core-runtime/gradle-cli-main/build.gradle.kts b/platforms/core-runtime/gradle-cli-main/build.gradle.kts index d4311ce93cce8..c282f26232d47 100644 --- a/platforms/core-runtime/gradle-cli-main/build.gradle.kts +++ b/platforms/core-runtime/gradle-cli-main/build.gradle.kts @@ -35,6 +35,7 @@ dependencies { manifestClasspath(projects.stdlibJavaExtensions) manifestClasspath(projects.buildProcessServices) manifestClasspath(projects.baseServices) + manifestClasspath(projects.classloaders) manifestClasspath(projects.concurrent) manifestClasspath(projects.serviceLookup) diff --git a/platforms/extensibility/test-kit/src/integTest/groovy/org/gradle/testkit/runner/enduser/GradleRunnerMiscEndUserIntegrationTest.groovy b/platforms/extensibility/test-kit/src/integTest/groovy/org/gradle/testkit/runner/enduser/GradleRunnerMiscEndUserIntegrationTest.groovy index 4e53cee42b39b..2521a7b54fc7e 100644 --- a/platforms/extensibility/test-kit/src/integTest/groovy/org/gradle/testkit/runner/enduser/GradleRunnerMiscEndUserIntegrationTest.groovy +++ b/platforms/extensibility/test-kit/src/integTest/groovy/org/gradle/testkit/runner/enduser/GradleRunnerMiscEndUserIntegrationTest.groovy @@ -64,6 +64,7 @@ class GradleRunnerMiscEndUserIntegrationTest extends BaseTestKitEndUserIntegrati || f.name.contains("commons-io") || f.name.contains("guava") || f.name.contains("gradle-base-services") + || f.name.contains("gradle-classloaders") || f.name.contains("gradle-stdlib-java-extensions") || f.name.contains("gradle-file-temp") || f.name.contains("gradle-tooling-api") diff --git a/platforms/jvm/testing-jvm/src/main/java/org/gradle/api/internal/tasks/testing/detection/ForkedTestClasspathFactory.java b/platforms/jvm/testing-jvm/src/main/java/org/gradle/api/internal/tasks/testing/detection/ForkedTestClasspathFactory.java index 57540543c85b1..2d874c2f3ef16 100644 --- a/platforms/jvm/testing-jvm/src/main/java/org/gradle/api/internal/tasks/testing/detection/ForkedTestClasspathFactory.java +++ b/platforms/jvm/testing-jvm/src/main/java/org/gradle/api/internal/tasks/testing/detection/ForkedTestClasspathFactory.java @@ -162,6 +162,7 @@ private ForkedTestClasspath getClasspathWithAdditionalModules( */ private ImmutableList withImplementation(List additionalImplementationClasspath) { return ImmutableList.copyOf(CollectionUtils.flattenCollections(URL.class, + moduleRegistry.getModule("gradle-classloaders").getImplementationClasspath().getAsURLs(), moduleRegistry.getModule("gradle-worker-main").getImplementationClasspath().getAsURLs(), moduleRegistry.getModule("gradle-logging").getImplementationClasspath().getAsURLs(), moduleRegistry.getModule("gradle-logging-api").getImplementationClasspath().getAsURLs(), From ba7a28104b9404cc5ef9aa68ae3ca6f5a88510bb Mon Sep 17 00:00:00 2001 From: Reinhold Degenfellner Date: Thu, 13 Feb 2025 14:26:29 +0100 Subject: [PATCH 3/3] Fix test because of additional jar file --- .../configuration-cache/build.gradle.kts | 1 + .../build.gradle.kts | 3 ++- .../build.gradle.kts | 1 + .../kotlin-dsl/build.gradle.kts | 1 + .../model-core/build.gradle.kts | 1 + .../worker-main/build.gradle.kts | 1 + .../core-execution/workers/build.gradle.kts | 1 + .../base-services/build.gradle.kts | 1 - .../FilteringClassLoaderTest.groovy | 3 ++- .../build-process-services/build.gradle.kts | 4 +++- .../core-runtime/build-state/build.gradle.kts | 1 + .../core-runtime/classloaders/build.gradle.kts | 5 +---- .../classloader/FilteringClassLoader.java | 18 +++++++++--------- .../internal/classpath/DefaultClassPath.java | 11 +++++++---- .../client-services/build.gradle.kts | 15 ++++++++------- .../daemon-protocol/build.gradle.kts | 1 + .../serialization/PayloadSerializerTest.groovy | 1 + .../daemon-server/build.gradle.kts | 3 ++- .../daemon-services/build.gradle.kts | 3 ++- .../daemon/services/DaemonServices.java | 2 +- .../core-runtime/gradle-cli/build.gradle.kts | 1 + .../build.gradle.kts | 2 +- .../core-runtime/launcher/build.gradle.kts | 1 + .../provider/ConnectionScopeServices.java | 2 +- .../core-runtime/messaging/build.gradle.kts | 1 + .../serialization/build.gradle.kts | 3 ++- .../serialization/PayloadSerializer.java | 7 +++---- .../tooling-api-provider/build.gradle.kts | 2 ++ .../plugin-development/build.gradle.kts | 1 + .../extensibility/plugin-use/build.gradle.kts | 1 + .../extensibility/test-kit/build.gradle.kts | 3 ++- .../unit-test-fixtures/build.gradle.kts | 1 + platforms/ide/tooling-api/build.gradle.kts | 1 + .../ToolingApiClasspathIntegrationTest.groovy | 2 +- platforms/jvm/language-groovy/build.gradle.kts | 1 + platforms/jvm/language-java/build.gradle.kts | 9 +++++---- platforms/jvm/language-jvm/build.gradle.kts | 1 + platforms/jvm/plugins-groovy/build.gradle.kts | 5 +++-- platforms/jvm/scala/build.gradle.kts | 5 +++-- platforms/jvm/testing-jvm/build.gradle.kts | 1 + .../ForkedTestClasspathFactoryTest.groovy | 2 +- .../dependency-management/build.gradle.kts | 1 + subprojects/composite-builds/build.gradle.kts | 1 + subprojects/core/build.gradle.kts | 1 + .../loadercache}/ModelClassLoaderFactory.java | 6 ++++-- ...ClassLoaderWorkerImplementationFactory.java | 5 +++-- .../child/WorkerProcessClassPathProvider.java | 12 +++++++----- .../internal/worker/request/WorkerAction.java | 2 +- .../internal-api-nullability.txt | 3 +-- .../internal-integ-testing/build.gradle.kts | 1 + .../build.gradle.kts | 1 + 51 files changed, 101 insertions(+), 61 deletions(-) rename {platforms/core-runtime/serialization/src/main/java/org/gradle/tooling/internal/provider/serialization => subprojects/core/src/main/java/org/gradle/api/internal/initialization/loadercache}/ModelClassLoaderFactory.java (92%) diff --git a/platforms/core-configuration/configuration-cache/build.gradle.kts b/platforms/core-configuration/configuration-cache/build.gradle.kts index 02504ce5c3906..4db95c9266bf0 100644 --- a/platforms/core-configuration/configuration-cache/build.gradle.kts +++ b/platforms/core-configuration/configuration-cache/build.gradle.kts @@ -39,6 +39,7 @@ dependencies { // TODO - it might be good to allow projects to contribute state to save and restore, rather than have this project know about everything implementation(projects.buildEvents) implementation(projects.buildOption) + implementation(projects.classloaders) implementation(projects.coreKotlinExtensions) implementation(projects.coreSerializationCodecs) implementation(projects.dependencyManagementSerializationCodecs) diff --git a/platforms/core-configuration/kotlin-dsl-provider-plugins/build.gradle.kts b/platforms/core-configuration/kotlin-dsl-provider-plugins/build.gradle.kts index 7675cc355c5d3..ecbbc8882f78d 100644 --- a/platforms/core-configuration/kotlin-dsl-provider-plugins/build.gradle.kts +++ b/platforms/core-configuration/kotlin-dsl-provider-plugins/build.gradle.kts @@ -5,7 +5,7 @@ plugins { description = "Kotlin DSL Provider Plugins" dependencies { - api(projects.baseServices) + api(projects.classloaders) api(projects.core) api(projects.coreApi) api(projects.kotlinDsl) @@ -18,6 +18,7 @@ dependencies { api(libs.inject) api(libs.kotlinStdlib) + implementation(projects.baseServices) implementation(projects.concurrent) implementation(projects.functional) implementation(projects.fileCollections) diff --git a/platforms/core-configuration/kotlin-dsl-tooling-builders/build.gradle.kts b/platforms/core-configuration/kotlin-dsl-tooling-builders/build.gradle.kts index 4f8f9de271109..3d41f4ad56d74 100644 --- a/platforms/core-configuration/kotlin-dsl-tooling-builders/build.gradle.kts +++ b/platforms/core-configuration/kotlin-dsl-tooling-builders/build.gradle.kts @@ -9,6 +9,7 @@ dependencies { api(projects.core) api(libs.kotlinStdlib) + implementation(projects.classloaders) implementation(projects.serviceLookup) implementation(projects.stdlibJavaExtensions) implementation(projects.time) diff --git a/platforms/core-configuration/kotlin-dsl/build.gradle.kts b/platforms/core-configuration/kotlin-dsl/build.gradle.kts index 4748310b64927..afc84847fdcfa 100644 --- a/platforms/core-configuration/kotlin-dsl/build.gradle.kts +++ b/platforms/core-configuration/kotlin-dsl/build.gradle.kts @@ -10,6 +10,7 @@ description = "Kotlin DSL Provider" dependencies { api(projects.buildProcessServices) api(projects.baseServices) + api(projects.classloaders) api(projects.core) api(projects.coreApi) api(projects.concurrent) diff --git a/platforms/core-configuration/model-core/build.gradle.kts b/platforms/core-configuration/model-core/build.gradle.kts index 97c753ec0b477..b9e58a0f98223 100644 --- a/platforms/core-configuration/model-core/build.gradle.kts +++ b/platforms/core-configuration/model-core/build.gradle.kts @@ -30,6 +30,7 @@ dependencies { implementation(projects.baseServicesGroovy) implementation(projects.baseAsm) + implementation(projects.classloaders) implementation(projects.logging) implementation(projects.problemsApi) implementation(projects.serviceProvider) diff --git a/platforms/core-execution/worker-main/build.gradle.kts b/platforms/core-execution/worker-main/build.gradle.kts index 5e8384a4d3431..636627eed850d 100644 --- a/platforms/core-execution/worker-main/build.gradle.kts +++ b/platforms/core-execution/worker-main/build.gradle.kts @@ -20,6 +20,7 @@ dependencies { api(projects.native) api(libs.jsr305) + implementation(projects.classloaders) implementation(projects.concurrent) implementation(projects.enterpriseLogging) implementation(projects.serviceProvider) diff --git a/platforms/core-execution/workers/build.gradle.kts b/platforms/core-execution/workers/build.gradle.kts index 937e21837362e..2771c5568d93f 100644 --- a/platforms/core-execution/workers/build.gradle.kts +++ b/platforms/core-execution/workers/build.gradle.kts @@ -7,6 +7,7 @@ description = "Infrastructure for starting and managing worker processes" dependencies { api(projects.baseServices) api(projects.buildOperations) + api(projects.classloaders) api(projects.concurrent) api(projects.core) api(projects.coreApi) diff --git a/platforms/core-runtime/base-services/build.gradle.kts b/platforms/core-runtime/base-services/build.gradle.kts index 5bc12891eba09..9c8e5ab36ba1b 100644 --- a/platforms/core-runtime/base-services/build.gradle.kts +++ b/platforms/core-runtime/base-services/build.gradle.kts @@ -41,7 +41,6 @@ dependencies { api(libs.jsr305) api(libs.guava) - implementation(projects.io) implementation(projects.time) implementation(projects.baseAsm) diff --git a/platforms/core-runtime/base-services/src/test/groovy/org/gradle/internal/classloader/FilteringClassLoaderTest.groovy b/platforms/core-runtime/base-services/src/test/groovy/org/gradle/internal/classloader/FilteringClassLoaderTest.groovy index 0f013b50bf089..96dacf2e71724 100644 --- a/platforms/core-runtime/base-services/src/test/groovy/org/gradle/internal/classloader/FilteringClassLoaderTest.groovy +++ b/platforms/core-runtime/base-services/src/test/groovy/org/gradle/internal/classloader/FilteringClassLoaderTest.groovy @@ -15,6 +15,7 @@ */ package org.gradle.internal.classloader + import org.gradle.test.precondition.Requires import org.gradle.test.preconditions.UnitTestPreconditions import org.junit.Before @@ -344,7 +345,7 @@ class FilteringClassLoaderTest extends Specification { void "spec is copied correctly"() { given: def parent = Mock(ClassLoader, useObjenesis: false) - def spec = new FilteringClassLoader.Spec([ 'allow.ClassName' ], [ 'allowPackage' ], [ 'allowPackagePrefix' ], [ 'allowPackageResource' ], [ 'allowResource' ], [ 'disallow.ClassName' ], [ 'disallowPackage' ]) + def spec = new FilteringClassLoader.Spec(['allow.ClassName' ], ['allowPackage' ], ['allowPackagePrefix' ], ['allowPackageResource' ], ['allowResource' ], ['disallow.ClassName' ], ['disallowPackage' ]) def filteringClassLoader = new FilteringClassLoader(parent, spec) def visitor = Mock(ClassLoaderVisitor) diff --git a/platforms/core-runtime/build-process-services/build.gradle.kts b/platforms/core-runtime/build-process-services/build.gradle.kts index 899fb30f1ad52..4a56874e2866c 100644 --- a/platforms/core-runtime/build-process-services/build.gradle.kts +++ b/platforms/core-runtime/build-process-services/build.gradle.kts @@ -5,10 +5,12 @@ plugins { description = "Services and types used to setup a build process from a Gradle distribution." dependencies { + api(projects.classloaders) api(projects.stdlibJavaExtensions) - api(projects.baseServices) api(libs.jsr305) + implementation(projects.baseServices) + implementation(libs.guava) testImplementation(libs.asm) diff --git a/platforms/core-runtime/build-state/build.gradle.kts b/platforms/core-runtime/build-state/build.gradle.kts index aae4de5e084f6..6a8789e7bc19b 100644 --- a/platforms/core-runtime/build-state/build.gradle.kts +++ b/platforms/core-runtime/build-state/build.gradle.kts @@ -22,6 +22,7 @@ description = "Types for build process and session state management" dependencies { api(projects.baseServices) + api(projects.classloaders) api(projects.core) api(projects.daemonProtocol) api(projects.instrumentationAgentServices) diff --git a/platforms/core-runtime/classloaders/build.gradle.kts b/platforms/core-runtime/classloaders/build.gradle.kts index 46ead4f657242..b8f100261aece 100644 --- a/platforms/core-runtime/classloaders/build.gradle.kts +++ b/platforms/core-runtime/classloaders/build.gradle.kts @@ -26,7 +26,6 @@ dependencies { api(projects.hashing) api(projects.stdlibJavaExtensions) - api(libs.guava) api(libs.jsr305) implementation(projects.baseAsm) @@ -35,9 +34,7 @@ dependencies { implementation(libs.commonsIo) implementation(libs.commonsLang) - implementation(libs.fastutil) - implementation(libs.kryo) - implementation(libs.slf4jApi) + implementation(libs.guava) compileOnly(libs.errorProneAnnotations) } diff --git a/platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classloader/FilteringClassLoader.java b/platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classloader/FilteringClassLoader.java index bf699cdac2e58..b7e4693a3c2e9 100644 --- a/platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classloader/FilteringClassLoader.java +++ b/platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classloader/FilteringClassLoader.java @@ -233,12 +233,12 @@ private static void addAll(Collection collection, Iterable eleme */ public boolean isEmpty() { return classNames.isEmpty() - && packageNames.isEmpty() - && packagePrefixes.isEmpty() - && resourcePrefixes.isEmpty() - && resourceNames.isEmpty() - && disallowedClassNames.isEmpty() - && disallowedPackagePrefixes.isEmpty(); + && packageNames.isEmpty() + && packagePrefixes.isEmpty() + && resourcePrefixes.isEmpty() + && resourceNames.isEmpty() + && disallowedClassNames.isEmpty() + && disallowedPackagePrefixes.isEmpty(); } /** @@ -355,7 +355,7 @@ public Set getDisallowedPackagePrefixes() { } } - private static class TrieSet implements Iterable { + public static class TrieSet implements Iterable { private final Trie trie; private final Set set; @@ -382,7 +382,7 @@ public Iterator iterator() { /** * Move the Trie class in :base-services to :functional once we can use Java 8 and delete this class. */ - private static class Trie implements Comparable { + public static class Trie implements Comparable { private final char chr; private final boolean terminal; private final Trie[] transitions; @@ -501,7 +501,7 @@ public Trie build() { } } - interface Action { + public interface Action { void execute(T target); } } diff --git a/platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classpath/DefaultClassPath.java b/platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classpath/DefaultClassPath.java index 2052ad0852601..cf2ac43ed1a0e 100644 --- a/platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classpath/DefaultClassPath.java +++ b/platforms/core-runtime/classloaders/src/main/java/org/gradle/internal/classpath/DefaultClassPath.java @@ -16,11 +16,13 @@ package org.gradle.internal.classpath; +import org.gradle.api.NonNullApi; import org.gradle.api.specs.Spec; import org.gradle.internal.Cast; import org.gradle.internal.UncheckedException; import org.gradle.util.internal.CollectionUtils; +import javax.annotation.Nullable; import java.io.File; import java.io.Serializable; import java.net.MalformedURLException; @@ -39,13 +41,14 @@ /** * An immutable classpath. */ +@NonNullApi public class DefaultClassPath implements ClassPath, Serializable { public static Builder builderWithExactSize(int size) { return new Builder(size); } - public static ClassPath of(Iterable files) { + public static ClassPath of(@Nullable Iterable files) { if (files == null) { return EMPTY; } else if (files instanceof Collection) { @@ -59,7 +62,7 @@ public static ClassPath of(Iterable files) { } } - public static ClassPath of(File... files) { + public static ClassPath of(@Nullable File... files) { if (files == null || files.length == 0) { return EMPTY; } else { @@ -70,7 +73,7 @@ public static ClassPath of(File... files) { /** * Only here for the Kotlin DSL, use {@link #of(Iterable)} instead. */ - public static ClassPath of(Collection files) { + public static ClassPath of(@Nullable Collection files) { if (files == null || files.isEmpty()) { return EMPTY; } else { @@ -217,7 +220,7 @@ public ClassPath build() { } } - protected static final class ImmutableUniqueList extends AbstractList implements Serializable { + public static final class ImmutableUniqueList extends AbstractList implements Serializable { private static final ImmutableUniqueList EMPTY = new ImmutableUniqueList(Collections.emptySet()); public static ImmutableUniqueList of(Collection collection) { diff --git a/platforms/core-runtime/client-services/build.gradle.kts b/platforms/core-runtime/client-services/build.gradle.kts index 8b434de4cd66f..cd7b2525550d0 100644 --- a/platforms/core-runtime/client-services/build.gradle.kts +++ b/platforms/core-runtime/client-services/build.gradle.kts @@ -21,28 +21,29 @@ plugins { description = "Services used by the Gradle client to interact with the daemon" dependencies { - api(projects.concurrent) - api(projects.messaging) - api(projects.logging) - api(projects.daemonProtocol) api(projects.baseServices) api(projects.buildOperations) + api(projects.classloaders) + api(projects.concurrent) + api(projects.daemonProtocol) + api(projects.enterpriseLogging) api(projects.functional) api(projects.jvmServices) + api(projects.logging) + api(projects.messaging) api(projects.modelCore) api(projects.native) - api(projects.enterpriseLogging) + api(projects.persistentCache) api(projects.processServices) api(projects.resources) api(projects.resourcesHttp) api(projects.serialization) api(projects.serviceLookup) api(projects.serviceProvider) - api(projects.persistentCache) api(projects.stdlibJavaExtensions) api(projects.time) - api(projects.toolingApi) api(projects.toolchainsJvmShared) + api(projects.toolingApi) // The client should not depend on core or core-api or projects that depend on these. // However, these project still contains some types that are shared between the client and daemon. diff --git a/platforms/core-runtime/daemon-protocol/build.gradle.kts b/platforms/core-runtime/daemon-protocol/build.gradle.kts index 9026e2f7752b6..6c23cd4836c99 100644 --- a/platforms/core-runtime/daemon-protocol/build.gradle.kts +++ b/platforms/core-runtime/daemon-protocol/build.gradle.kts @@ -23,6 +23,7 @@ description = "The messages and types sent between client and daemon" dependencies { api(libs.jsr305) api(projects.baseServices) + api(projects.classloaders) api(projects.loggingApi) api(projects.serialization) api(projects.logging) diff --git a/platforms/core-runtime/daemon-protocol/src/test/groovy/org/gradle/tooling/internal/provider/serialization/PayloadSerializerTest.groovy b/platforms/core-runtime/daemon-protocol/src/test/groovy/org/gradle/tooling/internal/provider/serialization/PayloadSerializerTest.groovy index 4309573e80e4e..875f0463509cf 100644 --- a/platforms/core-runtime/daemon-protocol/src/test/groovy/org/gradle/tooling/internal/provider/serialization/PayloadSerializerTest.groovy +++ b/platforms/core-runtime/daemon-protocol/src/test/groovy/org/gradle/tooling/internal/provider/serialization/PayloadSerializerTest.groovy @@ -16,6 +16,7 @@ package org.gradle.tooling.internal.provider.serialization +import org.gradle.api.internal.initialization.loadercache.ModelClassLoaderFactory import org.gradle.internal.classloader.FilteringClassLoader import org.gradle.tooling.internal.provider.AbstractClassGraphSpec import org.gradle.tooling.internal.provider.CustomPayload diff --git a/platforms/core-runtime/daemon-server/build.gradle.kts b/platforms/core-runtime/daemon-server/build.gradle.kts index 2bbc121514032..9b00b54b14333 100644 --- a/platforms/core-runtime/daemon-server/build.gradle.kts +++ b/platforms/core-runtime/daemon-server/build.gradle.kts @@ -26,7 +26,8 @@ dependencies { api(projects.messaging) implementation(libs.guava) - implementation(projects.baseServices) + + implementation(projects.classloaders) implementation(projects.concurrent) implementation(projects.instrumentationAgentServices) implementation(projects.stdlibJavaExtensions) diff --git a/platforms/core-runtime/daemon-services/build.gradle.kts b/platforms/core-runtime/daemon-services/build.gradle.kts index 3e3e74d64f810..9265e68a36dec 100644 --- a/platforms/core-runtime/daemon-services/build.gradle.kts +++ b/platforms/core-runtime/daemon-services/build.gradle.kts @@ -21,7 +21,7 @@ plugins { description = "Services used by the Gradle daemon to interact with the client" dependencies { - api(projects.baseServices) + api(projects.classloaders) api(projects.core) api(projects.coreApi) api(projects.daemonProtocol) @@ -34,6 +34,7 @@ dependencies { api(libs.jsr305) implementation(libs.commonsLang) + implementation(projects.baseServices) implementation(projects.functional) implementation(projects.loggingApi) implementation(projects.modelCore) diff --git a/platforms/core-runtime/daemon-services/src/main/java/org/gradle/internal/daemon/services/DaemonServices.java b/platforms/core-runtime/daemon-services/src/main/java/org/gradle/internal/daemon/services/DaemonServices.java index 849a637fb881a..87cc09ec206a3 100644 --- a/platforms/core-runtime/daemon-services/src/main/java/org/gradle/internal/daemon/services/DaemonServices.java +++ b/platforms/core-runtime/daemon-services/src/main/java/org/gradle/internal/daemon/services/DaemonServices.java @@ -16,6 +16,7 @@ package org.gradle.internal.daemon.services; +import org.gradle.api.internal.initialization.loadercache.ModelClassLoaderFactory; import org.gradle.api.internal.tasks.userinput.DefaultUserInputReader; import org.gradle.api.internal.tasks.userinput.UserInputReader; import org.gradle.internal.classpath.CachedClasspathTransformer; @@ -26,7 +27,6 @@ import org.gradle.internal.service.scopes.AbstractGradleModuleServices; import org.gradle.tooling.internal.provider.serialization.ClassLoaderCache; import org.gradle.tooling.internal.provider.serialization.DefaultPayloadClassLoaderRegistry; -import org.gradle.tooling.internal.provider.serialization.ModelClassLoaderFactory; import org.gradle.tooling.internal.provider.serialization.PayloadClassLoaderFactory; import org.gradle.tooling.internal.provider.serialization.PayloadSerializer; import org.gradle.tooling.internal.provider.serialization.WellKnownClassLoaderRegistry; diff --git a/platforms/core-runtime/gradle-cli/build.gradle.kts b/platforms/core-runtime/gradle-cli/build.gradle.kts index db4d94be07a60..aa0f17afc6fe3 100644 --- a/platforms/core-runtime/gradle-cli/build.gradle.kts +++ b/platforms/core-runtime/gradle-cli/build.gradle.kts @@ -42,6 +42,7 @@ dependencies { implementation(libs.groovy) implementation(projects.buildOption) implementation(projects.buildState) + implementation(projects.classloaders) implementation(projects.coreApi) implementation(projects.daemonServices) implementation(projects.enterpriseLogging) diff --git a/platforms/core-runtime/instrumentation-agent-services/build.gradle.kts b/platforms/core-runtime/instrumentation-agent-services/build.gradle.kts index 01c8b9d6c63e8..12ebbf5fb12ee 100644 --- a/platforms/core-runtime/instrumentation-agent-services/build.gradle.kts +++ b/platforms/core-runtime/instrumentation-agent-services/build.gradle.kts @@ -23,7 +23,7 @@ description = "Controls for the instrumentation agent potentially applied to the dependencies { api(projects.stdlibJavaExtensions) - implementation(projects.baseServices) + implementation(projects.classloaders) implementation(projects.functional) implementation(libs.jsr305) diff --git a/platforms/core-runtime/launcher/build.gradle.kts b/platforms/core-runtime/launcher/build.gradle.kts index f1d3ca31bc19e..013601cee8f8a 100644 --- a/platforms/core-runtime/launcher/build.gradle.kts +++ b/platforms/core-runtime/launcher/build.gradle.kts @@ -11,6 +11,7 @@ dependencies { api(projects.buildOperations) api(projects.buildOption) api(projects.buildState) + api(projects.classloaders) api(projects.cli) api(projects.concurrent) api(projects.core) diff --git a/platforms/core-runtime/launcher/src/main/java/org/gradle/tooling/internal/provider/ConnectionScopeServices.java b/platforms/core-runtime/launcher/src/main/java/org/gradle/tooling/internal/provider/ConnectionScopeServices.java index bc19c9d64b803..052127e9ad365 100644 --- a/platforms/core-runtime/launcher/src/main/java/org/gradle/tooling/internal/provider/ConnectionScopeServices.java +++ b/platforms/core-runtime/launcher/src/main/java/org/gradle/tooling/internal/provider/ConnectionScopeServices.java @@ -17,6 +17,7 @@ package org.gradle.tooling.internal.provider; import org.gradle.api.internal.file.FileCollectionFactory; +import org.gradle.api.internal.initialization.loadercache.ModelClassLoaderFactory; import org.gradle.api.internal.tasks.userinput.UserInputReader; import org.gradle.initialization.layout.BuildLayoutFactory; import org.gradle.internal.daemon.client.serialization.ClasspathInferer; @@ -36,7 +37,6 @@ import org.gradle.tooling.internal.adapter.ProtocolToModelAdapter; import org.gradle.tooling.internal.provider.serialization.ClassLoaderCache; import org.gradle.tooling.internal.provider.serialization.DefaultPayloadClassLoaderRegistry; -import org.gradle.tooling.internal.provider.serialization.ModelClassLoaderFactory; import org.gradle.tooling.internal.provider.serialization.PayloadSerializer; import org.gradle.tooling.internal.provider.serialization.WellKnownClassLoaderRegistry; diff --git a/platforms/core-runtime/messaging/build.gradle.kts b/platforms/core-runtime/messaging/build.gradle.kts index ff69f2d1b50b8..3839f5b238351 100644 --- a/platforms/core-runtime/messaging/build.gradle.kts +++ b/platforms/core-runtime/messaging/build.gradle.kts @@ -16,6 +16,7 @@ dependencies { api(libs.jsr305) api(libs.slf4jApi) + implementation(projects.classloaders) implementation(projects.io) implementation(projects.buildOperations) diff --git a/platforms/core-runtime/serialization/build.gradle.kts b/platforms/core-runtime/serialization/build.gradle.kts index 43f4714eaf9ac..dc32087610497 100644 --- a/platforms/core-runtime/serialization/build.gradle.kts +++ b/platforms/core-runtime/serialization/build.gradle.kts @@ -24,8 +24,8 @@ description = "Tools to serialize data" gradlebuildJava.usedInWorkers() dependencies { + api(projects.classloaders) api(projects.hashing) - api(projects.baseServices) api(projects.stdlibJavaExtensions) api(libs.guava) @@ -33,6 +33,7 @@ dependencies { implementation(projects.io) + implementation(libs.commonsIo) implementation(libs.fastutil) implementation(libs.kryo) implementation(libs.slf4jApi) diff --git a/platforms/core-runtime/serialization/src/main/java/org/gradle/tooling/internal/provider/serialization/PayloadSerializer.java b/platforms/core-runtime/serialization/src/main/java/org/gradle/tooling/internal/provider/serialization/PayloadSerializer.java index efcf07d1e8ae7..1947ebed0ee93 100644 --- a/platforms/core-runtime/serialization/src/main/java/org/gradle/tooling/internal/provider/serialization/PayloadSerializer.java +++ b/platforms/core-runtime/serialization/src/main/java/org/gradle/tooling/internal/provider/serialization/PayloadSerializer.java @@ -16,16 +16,15 @@ package org.gradle.tooling.internal.provider.serialization; -import javax.annotation.concurrent.ThreadSafe; - +import org.apache.commons.io.IOUtils; import org.gradle.internal.Cast; -import org.gradle.internal.IoActions; import org.gradle.internal.UncheckedException; import org.gradle.internal.io.StreamByteBuffer; import org.gradle.internal.service.scopes.Scope; import org.gradle.internal.service.scopes.ServiceScope; import javax.annotation.Nullable; +import javax.annotation.concurrent.ThreadSafe; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; @@ -55,7 +54,7 @@ public SerializedPayload serialize(@Nullable Object payload) { try { objectStream.writeObject(payload); } finally { - IoActions.closeQuietly(objectStream); + IOUtils.closeQuietly(objectStream); } Map classLoaders = new HashMap(); diff --git a/platforms/core-runtime/tooling-api-provider/build.gradle.kts b/platforms/core-runtime/tooling-api-provider/build.gradle.kts index 92beb31a0ec2d..f1ac96f5b85b8 100644 --- a/platforms/core-runtime/tooling-api-provider/build.gradle.kts +++ b/platforms/core-runtime/tooling-api-provider/build.gradle.kts @@ -29,9 +29,11 @@ dependencies { implementation(projects.serviceRegistryBuilder) implementation(libs.jsr305) implementation(libs.slf4jApi) + implementation(projects.launcher) implementation(projects.buildState) implementation(projects.baseServices) + implementation(projects.classloaders) implementation(projects.coreApi) implementation(projects.stdlibJavaExtensions) implementation(projects.logging) diff --git a/platforms/extensibility/plugin-development/build.gradle.kts b/platforms/extensibility/plugin-development/build.gradle.kts index 78b74fdb40954..ead83310cacca 100644 --- a/platforms/extensibility/plugin-development/build.gradle.kts +++ b/platforms/extensibility/plugin-development/build.gradle.kts @@ -29,6 +29,7 @@ dependencies { api(libs.jsr305) api(libs.inject) + implementation(projects.classloaders) implementation(projects.serviceLookup) implementation(projects.serviceProvider) implementation(projects.serviceRegistryBuilder) diff --git a/platforms/extensibility/plugin-use/build.gradle.kts b/platforms/extensibility/plugin-use/build.gradle.kts index 92b62a4939c19..ede8ac07b4bd5 100644 --- a/platforms/extensibility/plugin-use/build.gradle.kts +++ b/platforms/extensibility/plugin-use/build.gradle.kts @@ -5,6 +5,7 @@ plugins { dependencies { api(projects.serviceProvider) api(projects.baseServices) + api(projects.classloaders) api(projects.coreApi) api(projects.core) api(projects.dependencyManagement) diff --git a/platforms/extensibility/test-kit/build.gradle.kts b/platforms/extensibility/test-kit/build.gradle.kts index 0661774334d57..23c14269ddb1c 100644 --- a/platforms/extensibility/test-kit/build.gradle.kts +++ b/platforms/extensibility/test-kit/build.gradle.kts @@ -15,13 +15,14 @@ errorprone { } dependencies { - api(projects.baseServices) + api(projects.classloaders) api(projects.stdlibJavaExtensions) api(projects.logging) api(projects.toolingApi) api(libs.jsr305) + implementation(projects.baseServices) implementation(projects.core) implementation(projects.fileTemp) implementation(projects.io) diff --git a/platforms/extensibility/unit-test-fixtures/build.gradle.kts b/platforms/extensibility/unit-test-fixtures/build.gradle.kts index 94f0c62f7a19a..aa67e424b2b35 100644 --- a/platforms/extensibility/unit-test-fixtures/build.gradle.kts +++ b/platforms/extensibility/unit-test-fixtures/build.gradle.kts @@ -35,6 +35,7 @@ dependencies { api(projects.buildProcessServices) implementation(projects.buildState) + implementation(projects.classloaders) implementation(projects.fileCollections) implementation(projects.fileTemp) implementation(projects.instrumentationAgentServices) diff --git a/platforms/ide/tooling-api/build.gradle.kts b/platforms/ide/tooling-api/build.gradle.kts index 711d4c07b10a7..ff4d677b36ac0 100644 --- a/platforms/ide/tooling-api/build.gradle.kts +++ b/platforms/ide/tooling-api/build.gradle.kts @@ -43,6 +43,7 @@ dependencies { api(projects.baseServices) api(projects.buildOperations) + api(projects.classloaders) api(projects.concurrent) api(projects.enterpriseLogging) api(projects.logging) diff --git a/platforms/ide/tooling-api/src/integTest/groovy/org/gradle/integtests/tooling/ToolingApiClasspathIntegrationTest.groovy b/platforms/ide/tooling-api/src/integTest/groovy/org/gradle/integtests/tooling/ToolingApiClasspathIntegrationTest.groovy index 3321af0f4c448..8ab4adb43d70c 100644 --- a/platforms/ide/tooling-api/src/integTest/groovy/org/gradle/integtests/tooling/ToolingApiClasspathIntegrationTest.groovy +++ b/platforms/ide/tooling-api/src/integTest/groovy/org/gradle/integtests/tooling/ToolingApiClasspathIntegrationTest.groovy @@ -36,6 +36,6 @@ class ToolingApiClasspathIntegrationTest extends AbstractIntegrationSpec { // that references types that were previously eliminated from gradle-tooling-api.jar. def size = resolve.classpath.find { it.name ==~ /gradle-tooling-api.*\.jar/ }.size() - size < 3_200_000 + size < 3_390_000 } } diff --git a/platforms/jvm/language-groovy/build.gradle.kts b/platforms/jvm/language-groovy/build.gradle.kts index a5a53b0b9f098..9e554ff2e6f11 100644 --- a/platforms/jvm/language-groovy/build.gradle.kts +++ b/platforms/jvm/language-groovy/build.gradle.kts @@ -27,6 +27,7 @@ dependencies { api(libs.inject) api(libs.jsr305) + implementation(projects.classloaders) implementation(projects.concurrent) implementation(projects.serviceLookup) implementation(projects.stdlibJavaExtensions) diff --git a/platforms/jvm/language-java/build.gradle.kts b/platforms/jvm/language-java/build.gradle.kts index f6d2135e6a44e..d588070d1cb8a 100644 --- a/platforms/jvm/language-java/build.gradle.kts +++ b/platforms/jvm/language-java/build.gradle.kts @@ -20,12 +20,11 @@ errorprone { } dependencies { - api(projects.stdlibJavaExtensions) - api(projects.serialization) - api(projects.serviceProvider) api(projects.baseServices) api(projects.buildEvents) api(projects.buildOperations) + api(projects.buildProcessServices) + api(projects.classloaders) api(projects.core) api(projects.coreApi) api(projects.dependencyManagement) @@ -40,13 +39,15 @@ dependencies { api(projects.platformJvm) api(projects.problemsApi) api(projects.processServices) + api(projects.serialization) + api(projects.serviceProvider) api(projects.snapshots) + api(projects.stdlibJavaExtensions) api(projects.testSuitesBase) api(projects.toolchainsJvm) api(projects.toolchainsJvmShared) api(projects.workerMain) api(projects.workers) - api(projects.buildProcessServices) api(libs.asm) api(libs.fastutil) diff --git a/platforms/jvm/language-jvm/build.gradle.kts b/platforms/jvm/language-jvm/build.gradle.kts index b095c1fac0e24..91bfdbac4d53d 100644 --- a/platforms/jvm/language-jvm/build.gradle.kts +++ b/platforms/jvm/language-jvm/build.gradle.kts @@ -26,6 +26,7 @@ dependencies { api(libs.inject) api(libs.jsr305) + implementation(projects.classloaders) implementation(projects.dependencyManagement) implementation(projects.logging) implementation(projects.modelReflect) diff --git a/platforms/jvm/plugins-groovy/build.gradle.kts b/platforms/jvm/plugins-groovy/build.gradle.kts index b0f5efd50d36e..7bb8961133d10 100644 --- a/platforms/jvm/plugins-groovy/build.gradle.kts +++ b/platforms/jvm/plugins-groovy/build.gradle.kts @@ -16,8 +16,7 @@ dependencies { api(projects.modelCore) api(projects.buildProcessServices) - implementation(projects.serviceLookup) - implementation(projects.stdlibJavaExtensions) + implementation(projects.classloaders) implementation(projects.core) implementation(projects.fileCollections) implementation(projects.jvmServices) @@ -28,6 +27,8 @@ dependencies { implementation(projects.pluginsJava) implementation(projects.pluginsJavaBase) implementation(projects.reporting) + implementation(projects.serviceLookup) + implementation(projects.stdlibJavaExtensions) implementation(projects.toolchainsJvm) implementation(projects.toolchainsJvmShared) diff --git a/platforms/jvm/scala/build.gradle.kts b/platforms/jvm/scala/build.gradle.kts index 2ad3a081fea1c..b988ed98cbfb8 100644 --- a/platforms/jvm/scala/build.gradle.kts +++ b/platforms/jvm/scala/build.gradle.kts @@ -11,8 +11,9 @@ errorprone { } dependencies { - api(projects.stdlibJavaExtensions) api(projects.baseServices) + api(projects.buildProcessServices) + api(projects.classloaders) api(projects.core) api(projects.coreApi) api(projects.fileOperations) @@ -24,10 +25,10 @@ dependencies { api(projects.modelCore) api(projects.platformBase) api(projects.platformJvm) + api(projects.stdlibJavaExtensions) api(projects.toolchainsJvm) api(projects.toolchainsJvmShared) api(projects.workers) - api(projects.buildProcessServices) api(libs.groovy) api(libs.inject) diff --git a/platforms/jvm/testing-jvm/build.gradle.kts b/platforms/jvm/testing-jvm/build.gradle.kts index ebfedc14c8f6b..97115b304f2ed 100644 --- a/platforms/jvm/testing-jvm/build.gradle.kts +++ b/platforms/jvm/testing-jvm/build.gradle.kts @@ -34,6 +34,7 @@ dependencies { api(libs.inject) api(libs.jsr305) + implementation(projects.classloaders) implementation(projects.concurrent) implementation(projects.serviceLookup) implementation(projects.fileTemp) diff --git a/platforms/jvm/testing-jvm/src/test/groovy/org/gradle/api/internal/tasks/testing/detection/ForkedTestClasspathFactoryTest.groovy b/platforms/jvm/testing-jvm/src/test/groovy/org/gradle/api/internal/tasks/testing/detection/ForkedTestClasspathFactoryTest.groovy index 065172a626d09..5905927e91d41 100644 --- a/platforms/jvm/testing-jvm/src/test/groovy/org/gradle/api/internal/tasks/testing/detection/ForkedTestClasspathFactoryTest.groovy +++ b/platforms/jvm/testing-jvm/src/test/groovy/org/gradle/api/internal/tasks/testing/detection/ForkedTestClasspathFactoryTest.groovy @@ -31,7 +31,7 @@ import java.util.regex.Pattern class ForkedTestClasspathFactoryTest extends Specification { // The number of internal and external implementation jars loaded from the distribution regardless of framework. - private static final int NUM_INTERNAL_JARS = 29 + private static final int NUM_INTERNAL_JARS = 30 private static final int NUM_EXTERNAL_JARS = 6 ModuleRegistry moduleRegistry = Mock(ModuleRegistry) { diff --git a/platforms/software/dependency-management/build.gradle.kts b/platforms/software/dependency-management/build.gradle.kts index e004ee6a2883e..a0e1e721f44b0 100644 --- a/platforms/software/dependency-management/build.gradle.kts +++ b/platforms/software/dependency-management/build.gradle.kts @@ -44,6 +44,7 @@ dependencies { api(projects.buildOperations) api(projects.buildOption) api(projects.buildProcessServices) + api(projects.classloaders) api(projects.concurrent) api(projects.core) api(projects.coreApi) diff --git a/subprojects/composite-builds/build.gradle.kts b/subprojects/composite-builds/build.gradle.kts index 6b1009420aa63..fd0c71c42be40 100644 --- a/subprojects/composite-builds/build.gradle.kts +++ b/subprojects/composite-builds/build.gradle.kts @@ -30,6 +30,7 @@ dependencies { api(libs.inject) api(libs.jsr305) + implementation(projects.classloaders) implementation(projects.time) implementation(projects.enterpriseLogging) implementation(projects.enterpriseOperations) diff --git a/subprojects/core/build.gradle.kts b/subprojects/core/build.gradle.kts index 95a7d8cc6b733..17840e9b6844c 100644 --- a/subprojects/core/build.gradle.kts +++ b/subprojects/core/build.gradle.kts @@ -69,6 +69,7 @@ errorprone { dependencies { api(projects.baseAsm) + api(projects.classloaders) api(projects.concurrent) api(projects.instrumentationAgentServices) api(projects.serialization) diff --git a/platforms/core-runtime/serialization/src/main/java/org/gradle/tooling/internal/provider/serialization/ModelClassLoaderFactory.java b/subprojects/core/src/main/java/org/gradle/api/internal/initialization/loadercache/ModelClassLoaderFactory.java similarity index 92% rename from platforms/core-runtime/serialization/src/main/java/org/gradle/tooling/internal/provider/serialization/ModelClassLoaderFactory.java rename to subprojects/core/src/main/java/org/gradle/api/internal/initialization/loadercache/ModelClassLoaderFactory.java index 837376f3d0e6a..49f60bc740e33 100644 --- a/platforms/core-runtime/serialization/src/main/java/org/gradle/tooling/internal/provider/serialization/ModelClassLoaderFactory.java +++ b/subprojects/core/src/main/java/org/gradle/api/internal/initialization/loadercache/ModelClassLoaderFactory.java @@ -1,5 +1,5 @@ /* - * Copyright 2016 the original author or authors. + * Copyright 2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.gradle.tooling.internal.provider.serialization; +package org.gradle.api.internal.initialization.loadercache; import com.google.common.collect.ImmutableList; import org.gradle.TaskExecutionRequest; @@ -24,6 +24,8 @@ import org.gradle.internal.classloader.MultiParentClassLoader; import org.gradle.internal.classloader.SystemClassLoaderSpec; import org.gradle.internal.classloader.VisitableURLClassLoader; +import org.gradle.tooling.internal.provider.serialization.ClientOwnedClassLoaderSpec; +import org.gradle.tooling.internal.provider.serialization.PayloadClassLoaderFactory; import java.net.MalformedURLException; import java.net.URI; diff --git a/subprojects/core/src/main/java/org/gradle/process/internal/worker/child/ApplicationClassesInSystemClassLoaderWorkerImplementationFactory.java b/subprojects/core/src/main/java/org/gradle/process/internal/worker/child/ApplicationClassesInSystemClassLoaderWorkerImplementationFactory.java index fee0865a647f8..d77dd046653ba 100644 --- a/subprojects/core/src/main/java/org/gradle/process/internal/worker/child/ApplicationClassesInSystemClassLoaderWorkerImplementationFactory.java +++ b/subprojects/core/src/main/java/org/gradle/process/internal/worker/child/ApplicationClassesInSystemClassLoaderWorkerImplementationFactory.java @@ -67,6 +67,7 @@ * */ public class ApplicationClassesInSystemClassLoaderWorkerImplementationFactory { + public static final String WORKER_GRADLE_REMAPPING_PREFIX = "worker"; private final ClassPathRegistry classPathRegistry; private final TemporaryFileProvider temporaryFileProvider; private final File gradleUserHomeDir; @@ -97,7 +98,7 @@ public void prepareJavaCommand(long workerId, String displayName, WorkerProcessB if (runAsModule) { execSpec.getMainModule().set("gradle.worker"); } - execSpec.getMainClass().set("worker." + GradleWorkerMain.class.getName()); + execSpec.getMainClass().set(WORKER_GRADLE_REMAPPING_PREFIX + "." + GradleWorkerMain.class.getName()); if (useOptionsFile) { // Use an options file to pass across application classpath File optionsFile = temporaryFileProvider.createTemporaryFile("gradle-worker-classpath", "txt"); @@ -106,7 +107,7 @@ public void prepareJavaCommand(long workerId, String displayName, WorkerProcessB } else { // Use a dummy security manager, which hacks the application classpath into the system ClassLoader execSpec.classpath(workerMainClassPath); - execSpec.systemProperty("java.security.manager", "worker." + BootstrapSecurityManager.class.getName()); + execSpec.systemProperty("java.security.manager", WORKER_GRADLE_REMAPPING_PREFIX + "." + BootstrapSecurityManager.class.getName()); } // Serialize configuration for the worker process to it stdin diff --git a/subprojects/core/src/main/java/org/gradle/process/internal/worker/child/WorkerProcessClassPathProvider.java b/subprojects/core/src/main/java/org/gradle/process/internal/worker/child/WorkerProcessClassPathProvider.java index ec6d1f9ceb81b..b7ae806cf4c2a 100644 --- a/subprojects/core/src/main/java/org/gradle/process/internal/worker/child/WorkerProcessClassPathProvider.java +++ b/subprojects/core/src/main/java/org/gradle/process/internal/worker/child/WorkerProcessClassPathProvider.java @@ -16,7 +16,6 @@ package org.gradle.process.internal.worker.child; -import org.gradle.api.Action; import org.gradle.api.GradleException; import org.gradle.api.JavaVersion; import org.gradle.api.internal.ClassPathProvider; @@ -45,7 +44,6 @@ import org.gradle.internal.service.scopes.Scope; import org.gradle.internal.service.scopes.ServiceScope; import org.gradle.internal.stream.EncodedStream; -import org.gradle.internal.util.Trie; import org.gradle.process.internal.worker.GradleWorkerMain; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassVisitor; @@ -70,6 +68,8 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; +import static org.gradle.process.internal.worker.child.ApplicationClassesInSystemClassLoaderWorkerImplementationFactory.WORKER_GRADLE_REMAPPING_PREFIX; + @ServiceScope(Scope.UserHome.class) public class WorkerProcessClassPathProvider implements ClassPathProvider { private static final Logger LOGGER = LoggerFactory.getLogger(WorkerProcessClassPathProvider.class); @@ -221,6 +221,10 @@ private Set> getClassesForWorkerJar() { EncodedStream.EncodedInput.class, ClassLoaderUtils.class, FilteringClassLoader.class, + FilteringClassLoader.Action.class, + FilteringClassLoader.Trie.Builder.class, + FilteringClassLoader.Trie.class, + FilteringClassLoader.TrieSet.class, ClassLoaderHierarchy.class, ClassLoaderVisitor.class, ClassLoaderSpec.class, @@ -235,8 +239,6 @@ private Set> getClassesForWorkerJar() { PropertyMutator.class, Factory.class, Spec.class, - Action.class, - Trie.class, JavaVersion.class, JavaVersionParser.class); Set> result = new HashSet>(classes); @@ -274,7 +276,7 @@ private static class WorkerClassRemapper extends Remapper { @Override public String map(String typeName) { if (typeName.startsWith("org/gradle/")) { - return "worker/" + typeName; + return WORKER_GRADLE_REMAPPING_PREFIX + "/" + typeName; } return typeName; } diff --git a/subprojects/core/src/main/java/org/gradle/process/internal/worker/request/WorkerAction.java b/subprojects/core/src/main/java/org/gradle/process/internal/worker/request/WorkerAction.java index 28d4c910e7483..238ab451496ed 100644 --- a/subprojects/core/src/main/java/org/gradle/process/internal/worker/request/WorkerAction.java +++ b/subprojects/core/src/main/java/org/gradle/process/internal/worker/request/WorkerAction.java @@ -17,6 +17,7 @@ package org.gradle.process.internal.worker.request; import org.gradle.api.Action; +import org.gradle.api.internal.initialization.loadercache.ModelClassLoaderFactory; import org.gradle.api.internal.tasks.properties.annotations.OutputPropertyRoleAnnotationHandler; import org.gradle.api.problems.internal.DefaultProblems; import org.gradle.api.problems.internal.ExceptionProblemRegistry; @@ -41,7 +42,6 @@ import org.gradle.process.internal.worker.problem.WorkerProblemEmitter; import org.gradle.tooling.internal.provider.serialization.ClassLoaderCache; import org.gradle.tooling.internal.provider.serialization.DefaultPayloadClassLoaderRegistry; -import org.gradle.tooling.internal.provider.serialization.ModelClassLoaderFactory; import org.gradle.tooling.internal.provider.serialization.PayloadSerializer; import org.gradle.tooling.internal.provider.serialization.WellKnownClassLoaderRegistry; diff --git a/testing/architecture-test/src/changes/archunit-store/internal-api-nullability.txt b/testing/architecture-test/src/changes/archunit-store/internal-api-nullability.txt index 2d7908f7c551b..3abc265948040 100644 --- a/testing/architecture-test/src/changes/archunit-store/internal-api-nullability.txt +++ b/testing/architecture-test/src/changes/archunit-store/internal-api-nullability.txt @@ -1655,10 +1655,10 @@ Class is not anno Class is not annotated (directly or via its package) with @org.gradle.api.NonNullApi in (DefaultCachedClasspathTransformer.java:0) Class is not annotated (directly or via its package) with @org.gradle.api.NonNullApi in (DefaultCachedClasspathTransformer.java:0) Class is not annotated (directly or via its package) with @org.gradle.api.NonNullApi in (DefaultCachedClasspathTransformer.java:0) +Class is not annotated (directly or via its package) with @org.gradle.api.NonNullApi in (DefaultClassPath.java:0) Class is not annotated (directly or via its package) with @org.gradle.api.NonNullApi in (DefaultClassPath.java:0) Class is not annotated (directly or via its package) with @org.gradle.api.NonNullApi in (DefaultClassPath.java:0) Class is not annotated (directly or via its package) with @org.gradle.api.NonNullApi in (DefaultClassPath.java:0) -Class is not annotated (directly or via its package) with @org.gradle.api.NonNullApi in (DefaultClassPath.java:0) Class is not annotated (directly or via its package) with @org.gradle.api.NonNullApi in (DefaultClasspathTransformerCacheFactory.java:0) Class is not annotated (directly or via its package) with @org.gradle.api.NonNullApi in (FileUtils.java:0) Class is not annotated (directly or via its package) with @org.gradle.api.NonNullApi in (Instrumented.java:0) @@ -4758,7 +4758,6 @@ Class is not annotated (directly or via its package) with @org.gradle.api.NonNullApi in (DefaultPayloadClassLoaderRegistry.java:0) Class is not annotated (directly or via its package) with @org.gradle.api.NonNullApi in (DefaultPayloadClassLoaderRegistry.java:0) Class is not annotated (directly or via its package) with @org.gradle.api.NonNullApi in (DeserializeMap.java:0) -Class is not annotated (directly or via its package) with @org.gradle.api.NonNullApi in (ModelClassLoaderFactory.java:0) Class is not annotated (directly or via its package) with @org.gradle.api.NonNullApi in (PayloadClassLoaderFactory.java:0) Class is not annotated (directly or via its package) with @org.gradle.api.NonNullApi in (PayloadClassLoaderRegistry.java:0) Class is not annotated (directly or via its package) with @org.gradle.api.NonNullApi in (PayloadSerializer.java:0) diff --git a/testing/internal-integ-testing/build.gradle.kts b/testing/internal-integ-testing/build.gradle.kts index e49e1abe5ca03..5baa14fd41310 100644 --- a/testing/internal-integ-testing/build.gradle.kts +++ b/testing/internal-integ-testing/build.gradle.kts @@ -86,6 +86,7 @@ dependencies { implementation(projects.buildEvents) implementation(projects.buildOption) implementation(projects.buildState) + implementation(projects.classloaders) implementation(projects.cli) implementation(projects.daemonServices) implementation(projects.enterpriseOperations) diff --git a/testing/internal-performance-testing/build.gradle.kts b/testing/internal-performance-testing/build.gradle.kts index 11ea2870650e4..fd9fc1c67bfff 100644 --- a/testing/internal-performance-testing/build.gradle.kts +++ b/testing/internal-performance-testing/build.gradle.kts @@ -49,6 +49,7 @@ dependencies { api(libs.junit) api(libs.spock) + implementation(projects.classloaders) implementation(projects.concurrent) implementation(projects.wrapperShared)