diff --git a/build-tools/geode-repeat-test/src/main/groovy/org/apache/geode/gradle/testing/repeat/RepeatTest.groovy b/build-tools/geode-repeat-test/src/main/groovy/org/apache/geode/gradle/testing/repeat/RepeatTest.groovy
index e2d4912fe71d..451b521d39a3 100644
--- a/build-tools/geode-repeat-test/src/main/groovy/org/apache/geode/gradle/testing/repeat/RepeatTest.groovy
+++ b/build-tools/geode-repeat-test/src/main/groovy/org/apache/geode/gradle/testing/repeat/RepeatTest.groovy
@@ -23,7 +23,7 @@ import org.gradle.api.internal.tasks.testing.filter.DefaultTestFilter
import org.gradle.api.tasks.testing.Test
import org.gradle.api.tasks.Input
import org.gradle.internal.time.Clock
-import org.gradle.internal.work.WorkerLeaseRegistry
+import org.gradle.internal.work.WorkerLeaseService
public class RepeatTest extends Test {
@@ -53,7 +53,7 @@ public class RepeatTest extends Test {
super.createTestExecuter().workerFactory,
getActorFactory(),
getModuleRegistry(),
- getServices().get(WorkerLeaseRegistry.class),
+ getServices().get(WorkerLeaseService.class),
getServices().get(StartParameter.class).getMaxWorkerCount(),
getServices().get(Clock.class),
getServices().get(DocumentationRegistry.class),
diff --git a/build-tools/geode-repeat-test/src/main/java/org/apache/geode/gradle/testing/repeat/ExecutionTrackingTestResultProcessor.java b/build-tools/geode-repeat-test/src/main/java/org/apache/geode/gradle/testing/repeat/ExecutionTrackingTestResultProcessor.java
index 4d0e76d27f88..2e679087da2b 100644
--- a/build-tools/geode-repeat-test/src/main/java/org/apache/geode/gradle/testing/repeat/ExecutionTrackingTestResultProcessor.java
+++ b/build-tools/geode-repeat-test/src/main/java/org/apache/geode/gradle/testing/repeat/ExecutionTrackingTestResultProcessor.java
@@ -25,6 +25,7 @@
import org.gradle.api.internal.tasks.testing.TestResultProcessor;
import org.gradle.api.internal.tasks.testing.TestStartEvent;
import org.gradle.api.internal.tasks.testing.worker.WorkerTestClassProcessor;
+import org.gradle.api.tasks.testing.TestFailure;
import org.gradle.api.tasks.testing.TestOutputEvent;
/**
@@ -68,7 +69,7 @@ public void output(Object testId, TestOutputEvent event) {
}
@Override
- public void failure(Object testId, Throwable result) {
+ public void failure(Object testId, TestFailure result) {
processor.failure(testId, result);
}
diff --git a/build-tools/geode-repeat-test/src/main/java/org/apache/geode/gradle/testing/repeat/RepeatTestExecuter.java b/build-tools/geode-repeat-test/src/main/java/org/apache/geode/gradle/testing/repeat/RepeatTestExecuter.java
index 58f068106d42..036f3c691740 100644
--- a/build-tools/geode-repeat-test/src/main/java/org/apache/geode/gradle/testing/repeat/RepeatTestExecuter.java
+++ b/build-tools/geode-repeat-test/src/main/java/org/apache/geode/gradle/testing/repeat/RepeatTestExecuter.java
@@ -43,11 +43,11 @@
import org.gradle.internal.Factory;
import org.gradle.internal.actor.ActorFactory;
import org.gradle.internal.time.Clock;
-import org.gradle.internal.work.WorkerLeaseRegistry;
+import org.gradle.internal.work.WorkerLeaseService;
import org.gradle.process.internal.worker.WorkerProcessFactory;
/**
- * A copy of {@link DefaultTestExecuter} from Gradle v6.8.3, modified to process each test class
+ * A copy of {@link DefaultTestExecuter} from Gradle v7.6.6, modified to process each test class
* as many times as it was submitted. This is required by our {@link RepeatTest} task, because:
*
* - Geode's {@code RepeatTest} task operates by submitting each test class for processing
@@ -71,7 +71,7 @@ public class RepeatTestExecuter implements TestExecuter {
private final WorkerProcessFactory workerFactory;
private final ActorFactory actorFactory;
private final ModuleRegistry moduleRegistry;
- private final WorkerLeaseRegistry workerLeaseRegistry;
+ private final WorkerLeaseService workerLeaseService;
private final int maxWorkerCount;
private final Clock clock;
private final DocumentationRegistry documentationRegistry;
@@ -80,13 +80,13 @@ public class RepeatTestExecuter implements TestExecuter {
private TestClassProcessor processor;
public RepeatTestExecuter(WorkerProcessFactory workerFactory, ActorFactory actorFactory,
- ModuleRegistry moduleRegistry, WorkerLeaseRegistry workerLeaseRegistry, int maxWorkerCount,
+ ModuleRegistry moduleRegistry, WorkerLeaseService workerLeaseService, int maxWorkerCount,
Clock clock, DocumentationRegistry documentationRegistry, DefaultTestFilter testFilter,
int iterationCount) {
this.workerFactory = workerFactory;
this.actorFactory = actorFactory;
this.moduleRegistry = moduleRegistry;
- this.workerLeaseRegistry = workerLeaseRegistry;
+ this.workerLeaseService = workerLeaseService;
this.maxWorkerCount = maxWorkerCount;
this.clock = clock;
this.documentationRegistry = documentationRegistry;
@@ -99,9 +99,6 @@ public void execute(final JvmTestExecutionSpec testExecutionSpec,
TestResultProcessor testResultProcessor) {
final TestFramework testFramework = testExecutionSpec.getTestFramework();
final WorkerTestClassProcessorFactory testInstanceFactory = testFramework.getProcessorFactory();
- final WorkerLeaseRegistry.WorkerLease
- currentWorkerLease =
- workerLeaseRegistry.getCurrentWorkerLease();
final Set classpath = ImmutableSet.copyOf(testExecutionSpec.getClasspath());
final Set modulePath = ImmutableSet.copyOf(testExecutionSpec.getModulePath());
final List
@@ -109,7 +106,7 @@ public void execute(final JvmTestExecutionSpec testExecutionSpec,
testFramework.getTestWorkerImplementationModules();
final Factory forkingProcessorFactory = () -> {
TestClassProcessor forkingTestClassProcessor =
- new ForkingTestClassProcessor(currentWorkerLease, workerFactory, testInstanceFactory,
+ new ForkingTestClassProcessor(workerLeaseService, workerFactory, testInstanceFactory,
testExecutionSpec.getJavaForkOptions(), classpath, modulePath,
testWorkerImplementationModules, testFramework.getWorkerConfigurationAction(),
moduleRegistry, documentationRegistry);
@@ -139,7 +136,8 @@ public void execute(final JvmTestExecutionSpec testExecutionSpec,
detector = new DefaultTestClassScanner(testClassFiles, null, processor);
}
- new TestMainAction(detector, processor, testResultProcessor, clock, testExecutionSpec.getPath(),
+ new TestMainAction(detector, processor, testResultProcessor, workerLeaseService, clock,
+ testExecutionSpec.getPath(),
"Gradle Test Run " + testExecutionSpec.getIdentityPath()).run();
}
diff --git a/build-tools/geode-testing-isolation/src/main/groovy/org/apache/geode/gradle/testing/Executers.groovy b/build-tools/geode-testing-isolation/src/main/groovy/org/apache/geode/gradle/testing/Executers.groovy
index 01d33ca16aca..c7c59c806042 100644
--- a/build-tools/geode-testing-isolation/src/main/groovy/org/apache/geode/gradle/testing/Executers.groovy
+++ b/build-tools/geode-testing-isolation/src/main/groovy/org/apache/geode/gradle/testing/Executers.groovy
@@ -23,7 +23,7 @@ import org.gradle.api.internal.tasks.testing.JvmTestExecutionSpec
import org.gradle.api.internal.tasks.testing.TestExecuter
import org.gradle.api.internal.tasks.testing.detection.DefaultTestExecuter
import org.gradle.internal.time.Clock
-import org.gradle.internal.work.WorkerLeaseRegistry
+import org.gradle.internal.work.WorkerLeaseService
class Executers {
/**
@@ -48,7 +48,7 @@ class Executers {
workerProcessFactory,
testTask.actorFactory,
testTask.moduleRegistry,
- services.get(WorkerLeaseRegistry),
+ services.get(WorkerLeaseService),
services.get(StartParameter).getMaxWorkerCount(),
services.get(Clock),
services.get(DocumentationRegistry),
diff --git a/build-tools/geode-testing-isolation/src/main/groovy/org/apache/geode/gradle/testing/Workers.groovy b/build-tools/geode-testing-isolation/src/main/groovy/org/apache/geode/gradle/testing/Workers.groovy
index 0402465dbea1..d91ea4262b36 100644
--- a/build-tools/geode-testing-isolation/src/main/groovy/org/apache/geode/gradle/testing/Workers.groovy
+++ b/build-tools/geode-testing-isolation/src/main/groovy/org/apache/geode/gradle/testing/Workers.groovy
@@ -40,7 +40,7 @@ class Workers {
workerImplementationFactory.gradleUserHomeDir,
workerImplementationFactory.temporaryFileProvider,
donor.execHandleFactory,
- workerImplementationFactory.jvmVersionDetector,
+ donor.jvmVersionDetector,
donor.outputEventListener,
donor.memoryManager,
processLauncher)
diff --git a/build-tools/geode-testing-isolation/src/main/java/org/apache/geode/gradle/testing/process/LauncherProxyWorkerProcessBuilder.java b/build-tools/geode-testing-isolation/src/main/java/org/apache/geode/gradle/testing/process/LauncherProxyWorkerProcessBuilder.java
index a18f087b445b..436d2d11a664 100644
--- a/build-tools/geode-testing-isolation/src/main/java/org/apache/geode/gradle/testing/process/LauncherProxyWorkerProcessBuilder.java
+++ b/build-tools/geode-testing-isolation/src/main/java/org/apache/geode/gradle/testing/process/LauncherProxyWorkerProcessBuilder.java
@@ -50,7 +50,8 @@ public LauncherProxyWorkerProcessBuilder(WorkerProcessBuilder delegate,
@Override
public WorkerProcessBuilder applicationClasspath(Iterable files) {
- return delegate.applicationClasspath(files);
+ delegate.applicationClasspath(files);
+ return this;
}
@Override
@@ -60,7 +61,8 @@ public Set getApplicationClasspath() {
@Override
public WorkerProcessBuilder applicationModulePath(Iterable files) {
- return delegate.applicationModulePath(files);
+ delegate.applicationModulePath(files);
+ return this;
}
@Override
@@ -70,7 +72,8 @@ public Set getApplicationModulePath() {
@Override
public WorkerProcessBuilder setBaseName(String baseName) {
- return delegate.setBaseName(baseName);
+ delegate.setBaseName(baseName);
+ return this;
}
@Override
@@ -80,12 +83,14 @@ public String getBaseName() {
@Override
public WorkerProcessBuilder setLogLevel(LogLevel logLevel) {
- return delegate.setLogLevel(logLevel);
+ delegate.setLogLevel(logLevel);
+ return this;
}
@Override
public WorkerProcessBuilder sharedPackages(Iterable packages) {
- return delegate.sharedPackages(packages);
+ delegate.sharedPackages(packages);
+ return this;
}
@Override
@@ -105,7 +110,8 @@ public LogLevel getLogLevel() {
@Override
public WorkerProcessBuilder sharedPackages(String... packages) {
- return delegate.sharedPackages(packages);
+ delegate.sharedPackages(packages);
+ return this;
}
@Override
@@ -128,6 +134,17 @@ public void enableJvmMemoryInfoPublishing(boolean shouldPublish) {
delegate.enableJvmMemoryInfoPublishing(shouldPublish);
}
+ /**
+ * Returns this builder rather than the delegate's return value, because callers chain from this
+ * method and must continue to hold the wrapper that installs the process launcher.
+ */
+ @SuppressWarnings("deprecation")
+ @Override
+ public WorkerProcessBuilder setUseLegacyAddOpens(boolean useLegacyAddOpens) {
+ delegate.setUseLegacyAddOpens(useLegacyAddOpens);
+ return this;
+ }
+
/**
* Replaces the standard worker process's process launcher with this builder's launcher.
*/
diff --git a/build-tools/scripts/src/main/groovy/check-pom.gradle b/build-tools/scripts/src/main/groovy/check-pom.gradle
index d73492f3a805..4bd00d900edb 100644
--- a/build-tools/scripts/src/main/groovy/check-pom.gradle
+++ b/build-tools/scripts/src/main/groovy/check-pom.gradle
@@ -58,9 +58,22 @@ tasks.register('checkPom') {
}
}
+ // Renders a node so that sibling elements compare equal regardless of the order the POM
+ // generator emits them in (for example and within an ).
+ // Element order carries no meaning in these blocks, and the comparison below already ignores
+ // the order of the elements themselves.
+ def canonicalForm
+ canonicalForm = { node ->
+ def childNodes = node.children().findAll { it instanceof Node }
+ if (childNodes.isEmpty()) {
+ return "${node.name()}=${node.text()}"
+ }
+ return "${node.name()}[" + childNodes.collect { canonicalForm(it) }.sort().join(',') + "]"
+ }
+
def dependenciesBlocksMatch = { actual, expected ->
- def actualTreeSet = actual.dependencies.dependency.collect {it.toString()}.toSet()
- def expectedTreeSet = expected.dependencies.dependency.collect {it.toString()}.toSet()
+ def actualTreeSet = actual.dependencies.dependency.collect {canonicalForm(it)}.toSet()
+ def expectedTreeSet = expected.dependencies.dependency.collect {canonicalForm(it)}.toSet()
actualTreeSet.equals(expectedTreeSet)
}
diff --git a/build-tools/scripts/src/main/groovy/geode-publish-common.gradle b/build-tools/scripts/src/main/groovy/geode-publish-common.gradle
index fc78d2acc7c8..6ee243526f34 100644
--- a/build-tools/scripts/src/main/groovy/geode-publish-common.gradle
+++ b/build-tools/scripts/src/main/groovy/geode-publish-common.gradle
@@ -75,7 +75,7 @@ publishing {
withXml {
def providerAsElement = asElement()
providerAsElement.insertBefore(
- providerAsElement.ownerDocument().createComment(apacheLicense),
+ providerAsElement.getOwnerDocument().createComment(apacheLicense),
providerAsElement.firstChild)
}
}
diff --git a/build-tools/scripts/src/main/groovy/geode-test.gradle b/build-tools/scripts/src/main/groovy/geode-test.gradle
index c3fb6733e368..4b31ae8a73a8 100644
--- a/build-tools/scripts/src/main/groovy/geode-test.gradle
+++ b/build-tools/scripts/src/main/groovy/geode-test.gradle
@@ -185,6 +185,7 @@ gradle.taskGraph.whenReady({ graph ->
if (project.hasProperty('testJVMVer') && testJVMVer.toInteger() >= 9) {
jvmArgs += [
"--add-opens=java.base/java.io=ALL-UNNAMED",
+ "--add-opens=java.base/java.lang=ALL-UNNAMED",
"--add-opens=java.base/java.lang.annotation=ALL-UNNAMED",
"--add-opens=java.base/java.lang.module=ALL-UNNAMED",
"--add-opens=java.base/java.lang.ref=ALL-UNNAMED",
diff --git a/geode-assembly/build.gradle b/geode-assembly/build.gradle
index e1e557f0ab5e..93eab9f592da 100755
--- a/geode-assembly/build.gradle
+++ b/geode-assembly/build.gradle
@@ -417,26 +417,6 @@ tasks.register('gfshDepsJar', Jar) {
}
}
-// Extract legacy Tomcat 6 jars needed only to satisfy Javadoc for old session manager classes
-// (LifecycleSupport, SerializablePrincipal) without altering runtime dependencies.
-def legacyTomcatDir = "$buildDir/legacyTomcat"
-tasks.register('extractLegacyTomcatForJavadoc') {
- description = 'Extracts legacy Tomcat catalina jars for Javadoc symbol resolution.'
- outputs.dir(legacyTomcatDir)
- dependsOn configurations.webServerTomcat6
- doLast {
- delete legacyTomcatDir
- copy {
- from { zipTree(configurations.webServerTomcat6.singleFile) }
- // Include the full Tomcat 6 lib set so packages like org.apache.catalina.ha.session
- // (SerializablePrincipal) and util.LifecycleSupport are present. We keep it scoped
- // to Javadoc only via this extracted directory rather than adding runtime deps.
- include '**/lib/*.jar'
- into legacyTomcatDir
- }
- }
-}
-
tasks.register('docs', Javadoc) {
def docsDir = file("$buildDir/javadocs")
// Removed -Xwerror to avoid treating HTML5 compatibility warnings as errors
@@ -448,8 +428,10 @@ tasks.register('docs', Javadoc) {
// Do NOT add the javadocStubs sources directly; we only want them on the classpath, not in output.
+ // Only aggregate projects that actually compile Java sources. Platform (BOM) projects appear
+ // on the javadocOnly configuration but have no source sets or 'classes' task to depend on.
def docProjects = getDependencyProjectsFor('javadocOnly').findAll { proj ->
- proj.hasProperty('sourceSets')
+ proj.pluginManager.hasPlugin('java')
}
// Ensure compilation is done before aggregating docs
@@ -474,16 +456,11 @@ tasks.register('docs', Javadoc) {
// Use javadocOnly configuration with transitive dependencies to get external libraries
// This avoids cross-project configuration resolution while including necessary dependencies
- // Include legacy Tomcat jars for symbol resolution of older session manager classes
- dependsOn(tasks.named('extractLegacyTomcatForJavadoc'))
- // Use a lazy FileCollection for legacy Tomcat jars so extraction runs before it is resolved
- // Broaden legacy Tomcat inclusion (Option 2) to all jars in Tomcat6 lib so that
- // org.apache.catalina.util.LifecycleSupport and org.apache.catalina.ha.session.SerializablePrincipal
- // (present in clustering/ha related jars) are available to Javadoc without excluding sources.
- def legacyCatalinaJars = files { fileTree(legacyTomcatDir).matching { include '*.jar' } }
+ // The javadocStubs output supplies the older session manager symbols
+ // (org.apache.catalina.util.LifecycleSupport, org.apache.catalina.ha.session.SerializablePrincipal)
+ // that are absent from the Tomcat version on the javadocOnly configuration.
classpath = configurations.javadocOnly +
files(docProjects.collect { proj -> proj.sourceSets.main.output }) +
- legacyCatalinaJars +
sourceSets.javadocStubs.output
options.addStringOption('Xwerror','-quiet')
diff --git a/geode-assembly/src/acceptanceTest/java/org/apache/geode/management/internal/rest/GradleBuildWithGeodeCoreAcceptanceTest.java b/geode-assembly/src/acceptanceTest/java/org/apache/geode/management/internal/rest/GradleBuildWithGeodeCoreAcceptanceTest.java
index 0fdaaab80f39..7142c21fcf37 100644
--- a/geode-assembly/src/acceptanceTest/java/org/apache/geode/management/internal/rest/GradleBuildWithGeodeCoreAcceptanceTest.java
+++ b/geode-assembly/src/acceptanceTest/java/org/apache/geode/management/internal/rest/GradleBuildWithGeodeCoreAcceptanceTest.java
@@ -66,7 +66,7 @@ public void testBasicGradleBuild() {
copyDirectoryResource(projectDir, buildDir);
GradleConnector connector = GradleConnector.newConnector();
- connector.useGradleVersion("7.3.3");
+ connector.useGradleVersion("7.6.6");
connector.forProjectDirectory(buildDir);
ProjectConnection connection = connector.connect();
diff --git a/gradle.properties b/gradle.properties
index 2773901c866a..b31cff6130ec 100755
--- a/gradle.properties
+++ b/gradle.properties
@@ -47,7 +47,7 @@ buildId = 0
productName = Apache Geode
productOrg = Apache Software Foundation (ASF)
-minimumGradleVersion = 7.3.3
+minimumGradleVersion = 7.6.6
# Set this on the command line with -P or in ~/.gradle/gradle.properties
# to change the buildDir location. Use an absolute path.
buildRoot=
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
index 943f0cbfa754..afba109285af 100644
Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 70d977784219..f429f1b9ea5a 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.6-all.zip
networkTimeout=10000
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists