This is an automated email from the ASF dual-hosted git repository. stariy95 pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/cayenne.git
commit 004fb7668927c27fbae3a1fc385df8fb87fb33f3 Author: Nikita Timofeev <[email protected]> AuthorDate: Mon May 11 16:52:23 2026 +0400 CAY-2953 Upgrade Gradle to 9.4.0 --- .claude/rules/cayenne-gradle-plugin/build-jdk.md | 10 +++--- .github/workflows/verify-deploy-on-push.yml | 2 +- cayenne-gradle-plugin/build.gradle | 38 +++++++++------------- .../gradle/wrapper/gradle-wrapper.properties | 2 +- cayenne-gradle-plugin/pom.xml | 13 +++++--- .../java/org/apache/cayenne/tools/CgenTask.java | 22 ++++++++++++- .../org/apache/cayenne/tools/GradlePlugin.java | 19 +++-------- .../apache/cayenne/tools/model/DbImportConfig.java | 7 ++-- .../cayenne/tools/model/FilterContainer.java | 19 ++++++++--- .../cayenne/tools/model/SchemaContainer.java | 7 ++-- .../org/apache/cayenne/tools/GradlePluginIT.java | 2 +- .../tools/dbimport-with-project-dependency.gradle | 6 +--- 12 files changed, 78 insertions(+), 69 deletions(-) diff --git a/.claude/rules/cayenne-gradle-plugin/build-jdk.md b/.claude/rules/cayenne-gradle-plugin/build-jdk.md index fe4458c7b..c806fe7a3 100644 --- a/.claude/rules/cayenne-gradle-plugin/build-jdk.md +++ b/.claude/rules/cayenne-gradle-plugin/build-jdk.md @@ -5,11 +5,9 @@ description: cayenne-gradle-plugin Gradle version compatibility --- The `cayenne-gradle-plugin` integration tests run Gradle builds via `exec-maven-plugin`. -Gradle 8.x does not support Java > 21. +The module uses Gradle 9.4.0, which supports running on Java 21 through 26. -CI excludes the module on Java 25+ by passing `--projects !cayenne-gradle-plugin` -to Maven (see `verify-deploy-on-push.yml`). No pom changes are needed — Maven's -built-in project exclusion handles it. Releases always use Java 21, so the module -is always included there. +CI includes this module on Java 21 and Java 25. The Maven enforcer in the module +keeps the build aligned with Gradle's supported runtime range. -The IT test (`GradlePluginIT`) tests Gradle 8.5 compatibility and only runs on Java 21. +The IT test (`GradlePluginIT`) tests Gradle 9.4.0 compatibility. diff --git a/.github/workflows/verify-deploy-on-push.yml b/.github/workflows/verify-deploy-on-push.yml index 707cc92b9..bb9361b32 100644 --- a/.github/workflows/verify-deploy-on-push.yml +++ b/.github/workflows/verify-deploy-on-push.yml @@ -47,7 +47,7 @@ jobs: cache: 'maven' - name: mvn verify ${{ matrix.db-profile }} - run: mvn verify -q -DcayenneTestConnection=${{ matrix.db-profile }} -DcayenneLogLevel=ERROR ${{ matrix.jdk != 21 && '--projects !cayenne-gradle-plugin' || '' }} + run: mvn verify -q -DcayenneTestConnection=${{ matrix.db-profile }} -DcayenneLogLevel=ERROR deploy: needs: verify diff --git a/cayenne-gradle-plugin/build.gradle b/cayenne-gradle-plugin/build.gradle index 760ae9c50..06c34ae67 100644 --- a/cayenne-gradle-plugin/build.gradle +++ b/cayenne-gradle-plugin/build.gradle @@ -32,6 +32,9 @@ plugins { java { sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 + withSourcesJar() + withJavadocJar() } repositories { @@ -44,6 +47,10 @@ dependencies { implementation localGroovy() } +test { + useJUnitPlatform() +} + def projectVersion = getProjectVersion() group = 'org.apache.cayenne.plugins' @@ -69,24 +76,24 @@ if (classpathFile.file) { // Create file with cayenne-gradle-plugin version task versionFile { - def resourceOutputDir = file("$buildDir/resources/main/") doFirst { + def resourceOutputDir = layout.buildDirectory.dir('resources/main').get().asFile resourceOutputDir.exists() || resourceOutputDir.mkdirs() // file name must be in sync with GradleCayenneExtension - def file = file("$buildDir/resources/main/cayenne.version") + def file = layout.buildDirectory.file('resources/main/cayenne.version').get().asFile file.write(cayenneVersion.toString()) } } def processLicenseFile(fileName) { def context = new VelocityContext(Map.of("binary", false)) - def outputWriter = new FileWriter(new File("$buildDir/resources/main/META-INF/cayenne/${fileName}.txt")) + def outputWriter = new FileWriter(layout.buildDirectory.file("resources/main/META-INF/cayenne/${fileName}.txt").get().asFile) def template - def templateFile = new File("$buildDir/resources/tpl/META-INF/cayenne/${fileName}.txt.vm"); + def templateFile = layout.buildDirectory.file("resources/tpl/META-INF/cayenne/${fileName}.txt.vm").get().asFile if(templateFile.exists()) { template = templateFile.text } else { - throw new RuntimeException("Template file `$buildDir/resources/tpl/META-INF/cayenne/${fileName}.txt.vm` doesn't exist") + throw new RuntimeException("Template file `${templateFile}` doesn't exist") } try { @@ -100,28 +107,13 @@ def processLicenseFile(fileName) { // Copy license and notice files task licenseFiles(type: Copy) { from '../build-tools/cayenne-legal/src/main/resources/' - into "$buildDir/resources/tpl/" + into layout.buildDirectory.dir('resources/tpl') doLast { - mkdir("$buildDir/resources/main/META-INF/cayenne/") + layout.buildDirectory.dir('resources/main/META-INF/cayenne').get().asFile.mkdirs() processLicenseFile("LICENSE") processLicenseFile("NOTICE") } } -task sourcesJar(type: Jar, dependsOn: classes) { - archiveClassifier = 'sources' - from sourceSets.main.allSource -} - -task javadocJar(type: Jar, dependsOn: javadoc) { - archiveClassifier = 'javadoc' - from javadoc.destinationDir -} - -artifacts { - archives sourcesJar - archives javadocJar -} - processResources.dependsOn licenseFiles -processResources.dependsOn versionFile \ No newline at end of file +processResources.dependsOn versionFile diff --git a/cayenne-gradle-plugin/gradle/wrapper/gradle-wrapper.properties b/cayenne-gradle-plugin/gradle/wrapper/gradle-wrapper.properties index 7da9bf257..e37728236 100644 --- a/cayenne-gradle-plugin/gradle/wrapper/gradle-wrapper.properties +++ b/cayenne-gradle-plugin/gradle/wrapper/gradle-wrapper.properties @@ -15,7 +15,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.0-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/cayenne-gradle-plugin/pom.xml b/cayenne-gradle-plugin/pom.xml index 6c551976d..ccf07f53e 100644 --- a/cayenne-gradle-plugin/pom.xml +++ b/cayenne-gradle-plugin/pom.xml @@ -69,15 +69,15 @@ <artifactId>maven-enforcer-plugin</artifactId> <executions> <execution> - <id>enforce-jdk21</id> + <id>enforce-gradle-jdk</id> <goals> <goal>enforce</goal> </goals> <configuration> <rules> <requireJavaVersion> - <version>[21,22)</version> - <message>cayenne-gradle-plugin requires JDK 21 (Gradle 8.x does not support Java > 21). Use JDK 21 to build this module.</message> + <version>[21,27)</version> + <message>cayenne-gradle-plugin requires JDK 21 through 26 to match Gradle 9.4.0 runtime support.</message> </requireJavaVersion> </rules> </configuration> @@ -169,6 +169,11 @@ <artifactId>junit-jupiter</artifactId> <scope>test</scope> </dependency> + <dependency> + <groupId>org.junit.platform</groupId> + <artifactId>junit-platform-launcher</artifactId> + <scope>test</scope> + </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> @@ -177,4 +182,4 @@ </dependencies> -</project> \ No newline at end of file +</project> diff --git a/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/CgenTask.java b/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/CgenTask.java index 35f553856..b5100bf00 100644 --- a/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/CgenTask.java +++ b/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/CgenTask.java @@ -571,10 +571,15 @@ public class CgenTask extends BaseCayenneTask { setExcludeEmbeddables(excludeEmbeddables); } + @Internal public Boolean isMakePairs() { return makePairs; } + public Boolean getMakePairs() { + return makePairs; + } + public void setMakePairs(Boolean makePairs) { this.makePairs = makePairs; } @@ -607,10 +612,15 @@ public class CgenTask extends BaseCayenneTask { setOutputPattern(outputPattern); } + @Internal public Boolean isOverwrite() { return overwrite; } + public Boolean getOverwrite() { + return overwrite; + } + public void setOverwrite(Boolean overwrite) { this.overwrite = overwrite; } @@ -679,10 +689,15 @@ public class CgenTask extends BaseCayenneTask { setEmbeddableTemplate(embeddableTemplate); } + @Internal public Boolean isUsePkgPath() { return usePkgPath; } + public Boolean getUsePkgPath() { + return usePkgPath; + } + public void setUsePkgPath(Boolean usePkgPath) { this.usePkgPath = usePkgPath; } @@ -691,10 +706,15 @@ public class CgenTask extends BaseCayenneTask { setUsePkgPath(usePkgPath); } + @Internal public Boolean isCreatePropertyNames() { return createPropertyNames; } + public Boolean getCreatePropertyNames() { + return createPropertyNames; + } + public void setCreatePropertyNames(Boolean createPropertyNames) { this.createPropertyNames = createPropertyNames; } @@ -730,4 +750,4 @@ public class CgenTask extends BaseCayenneTask { public void externalToolConfig(String externalToolConfig) { setExternalToolConfig(externalToolConfig); } -} \ No newline at end of file +} diff --git a/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/GradlePlugin.java b/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/GradlePlugin.java index 0688977cf..d702e54e4 100644 --- a/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/GradlePlugin.java +++ b/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/GradlePlugin.java @@ -19,9 +19,6 @@ package org.apache.cayenne.tools; -import java.util.HashMap; -import java.util.Map; - import org.gradle.api.Plugin; import org.gradle.api.Project; @@ -31,16 +28,8 @@ public class GradlePlugin implements Plugin<Project> { project.getExtensions().create("cayenne", GradleCayenneExtension.class, project); // Register tasks - Map<String, Object> map = new HashMap<>(1); - map.put("type", CgenTask.class); - project.task(map, "cgen"); - - Map<String, Object> map1 = new HashMap<>(1); - map1.put("type", DbImportTask.class); - project.task(map1, "cdbimport"); - - Map<String, Object> map2 = new HashMap<>(1); - map2.put("type", DbGenerateTask.class); - project.task(map2, "cdbgen"); + project.getTasks().register("cgen", CgenTask.class); + project.getTasks().register("cdbimport", DbImportTask.class); + project.getTasks().register("cdbgen", DbGenerateTask.class); } -} \ No newline at end of file +} diff --git a/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/model/DbImportConfig.java b/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/model/DbImportConfig.java index 9c2ed0864..23b4cc5aa 100644 --- a/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/model/DbImportConfig.java +++ b/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/model/DbImportConfig.java @@ -26,7 +26,6 @@ import java.util.LinkedList; import groovy.lang.Closure; import org.apache.cayenne.dbsync.reverse.dbimport.ReverseEngineering; import org.apache.cayenne.dbsync.reverse.dbimport.Schema; -import org.gradle.util.ConfigureUtil; /** * @since 4.0 @@ -117,11 +116,11 @@ public class DbImportConfig extends SchemaContainer { } public void catalog(Closure<?> closure) { - catalogs.add(ConfigureUtil.configure(closure, new SchemaContainer())); + catalogs.add(configure(closure, new SchemaContainer())); } public void catalog(String name, Closure<?> closure) { - catalogs.add(ConfigureUtil.configure(closure, new SchemaContainer(name))); + catalogs.add(configure(closure, new SchemaContainer(name))); } public ReverseEngineering toReverseEngineering() { @@ -286,4 +285,4 @@ public class DbImportConfig extends SchemaContainer { public void tableTypes(String... tableTypes) { this.tableTypes.addAll(Arrays.asList(tableTypes)); } -} \ No newline at end of file +} diff --git a/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/model/FilterContainer.java b/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/model/FilterContainer.java index c214976b5..5d3bcf40e 100644 --- a/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/model/FilterContainer.java +++ b/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/model/FilterContainer.java @@ -23,7 +23,6 @@ import java.util.Collection; import java.util.LinkedList; import groovy.lang.Closure; -import org.gradle.util.ConfigureUtil; /** * @since 4.0 @@ -55,11 +54,11 @@ public class FilterContainer { } public void includeTable(Closure<?> closure) { - includeTables.add(ConfigureUtil.configure(closure, new IncludeTable())); + includeTables.add(configure(closure, new IncludeTable())); } public void includeTable(String pattern, Closure<?> closure) { - includeTables.add(ConfigureUtil.configure(closure, new IncludeTable(pattern))); + includeTables.add(configure(closure, new IncludeTable(pattern))); } public void includeTables(String... patterns) { @@ -140,6 +139,18 @@ public class FilterContainer { collection.add(new PatternParam(name)); } + static <T> T configure(Closure<?> closure, T target) { + Closure<?> clonedClosure = (Closure<?>) closure.clone(); + clonedClosure.setDelegate(target); + clonedClosure.setResolveStrategy(Closure.DELEGATE_FIRST); + if (clonedClosure.getMaximumNumberOfParameters() == 0) { + clonedClosure.call(); + } else { + clonedClosure.call(target); + } + return target; + } + <C extends org.apache.cayenne.dbsync.reverse.dbimport.FilterContainer> C fillContainer(final C container) { container.setName(name); for(IncludeTable table : includeTables) { @@ -176,4 +187,4 @@ public class FilterContainer { this.name = name; } -} \ No newline at end of file +} diff --git a/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/model/SchemaContainer.java b/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/model/SchemaContainer.java index 4c4e01593..d6d92e865 100644 --- a/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/model/SchemaContainer.java +++ b/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/model/SchemaContainer.java @@ -25,7 +25,6 @@ import java.util.LinkedList; import groovy.lang.Closure; import org.apache.cayenne.dbsync.reverse.dbimport.Catalog; import org.apache.cayenne.dbsync.reverse.dbimport.Schema; -import org.gradle.util.ConfigureUtil; /** * @since 4.0 @@ -46,11 +45,11 @@ public class SchemaContainer extends FilterContainer { } public void schema(Closure<?> closure) { - schemas.add(ConfigureUtil.configure(closure, new FilterContainer())); + schemas.add(configure(closure, new FilterContainer())); } public void schema(String name, Closure<?> closure) { - schemas.add(ConfigureUtil.configure(closure, new FilterContainer(name))); + schemas.add(configure(closure, new FilterContainer(name))); } Catalog toCatalog() { @@ -60,4 +59,4 @@ public class SchemaContainer extends FilterContainer { } return catalog; } -} \ No newline at end of file +} diff --git a/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/GradlePluginIT.java b/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/GradlePluginIT.java index 4fa12f9ba..12be7310b 100644 --- a/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/GradlePluginIT.java +++ b/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/GradlePluginIT.java @@ -51,7 +51,7 @@ public class GradlePluginIT extends BaseTaskIT { @Test public void gradleVersionsCompatibility() { - String[] versions = {"8.5"}; + String[] versions = {"9.4.0"}; List<String> failedVersions = new ArrayList<>(); for(String version : versions) { diff --git a/cayenne-gradle-plugin/src/test/resources/org/apache/cayenne/tools/dbimport-with-project-dependency.gradle b/cayenne-gradle-plugin/src/test/resources/org/apache/cayenne/tools/dbimport-with-project-dependency.gradle index f6c043031..1d7d0603e 100644 --- a/cayenne-gradle-plugin/src/test/resources/org/apache/cayenne/tools/dbimport-with-project-dependency.gradle +++ b/cayenne-gradle-plugin/src/test/resources/org/apache/cayenne/tools/dbimport-with-project-dependency.gradle @@ -38,11 +38,7 @@ dependencies { implementation 'mysql:mysql-connector-java:6.0.5' } -configurations { - project.configurations.getByName("implementation").setCanBeResolved(true) -} - repositories { mavenLocal() mavenCentral() -} \ No newline at end of file +}
