This is an automated email from the ASF dual-hosted git repository. rzo1 pushed a commit to branch tomee-10.x in repository https://gitbox.apache.org/repos/asf/tomee.git
commit 16522f909a437c8a9e52d32b39742391171d1bea Author: Richard Zowalla <[email protected]> AuthorDate: Sun Sep 20 20:31:22 2026 +0200 TOMEE-4706 migrate the Gradle plugin to a current Gradle version The plugin was built against Gradle 3.0 and did not work with current Gradle. org.gradle:gradle-core was never published past 6.1.1, so it cannot express a modern Gradle API dependency from Maven. The module uses dev.gradleplugins:gradle-api instead, which is the Gradle API packaged as a Maven artifact, the equivalent of gradleApi() in a Gradle build. It comes from Maven Central, so the repo.gradle.org repository that only gradle-core needed is dropped. Removed and deprecated API: Project.getBuildDir() is deprecated since Gradle 8 and removed in Gradle 9, and is replaced with project.getLayout().getBuildDirectory(). org.gradle.util.GFileUtils is no longer public API, so the two call sites use java.nio.file.Files. fixConfig() called classpath.add(...) on the classpath field inside if (classpath == null). It only avoided a NullPointerException when the argument expression threw UnknownConfigurationException first. It now assigns the configuration, which is what was meant. Gradle 9 fails the build on invalid task properties: @Optional is dropped from 12 primitive properties, since a primitive always has a value. serverXml, docBase, workDir, modules and classpath were @Input, which is not allowed for File and FileCollection types. The task starts a blocking server and never takes part in up-to-date checking, and its values are injected reflectively from the extension rather than through Gradle's property mechanism, so they are @Internal. singleClassloader, conf and classloaderFilteredPackages were annotated but had no getter, so Gradle ignored the annotation and warned. They have getters now. TomEEEmbeddedExtension.isSkipDefaultRepository() returned a boxed Boolean, which is not a valid bean property with an is- prefix and is deprecated for removal in Gradle 10. The field and the setter were already primitive, so the getter is boolean now. The caller's null check was always true for an autoboxed primitive and is removed, so behaviour is unchanged. Verified against Gradle 9.5.1 with a sample project: the plugin applies, the extension configuration reaches the task, dependencies resolve, TomEE Embedded boots, the deployed webapp answers HTTP 200, and exit shuts it down cleanly. One deprecation is left: the task calls getProject() from its @TaskAction, which the configuration cache does not allow and Gradle 10 will reject. Capturing the project state at configuration time is a larger refactor, left for its own change. (cherry picked from commit 2cd5569ef0e0fa47b0ab3097520885db3ff827b2) --- .../gradle/embedded/TomEEEmbeddedExtension.java | 2 +- .../tomee/gradle/embedded/TomEEEmbeddedPlugin.java | 2 +- .../tomee/gradle/embedded/TomEEEmbeddedTask.java | 69 +++++++++++----------- gradle/pom.xml | 26 +++++--- 4 files changed, 54 insertions(+), 45 deletions(-) diff --git a/gradle/gradle-tomee-embedded/src/main/java/org/apache/tomee/gradle/embedded/TomEEEmbeddedExtension.java b/gradle/gradle-tomee-embedded/src/main/java/org/apache/tomee/gradle/embedded/TomEEEmbeddedExtension.java index 98ef2b0a17..200c978e3c 100644 --- a/gradle/gradle-tomee-embedded/src/main/java/org/apache/tomee/gradle/embedded/TomEEEmbeddedExtension.java +++ b/gradle/gradle-tomee-embedded/src/main/java/org/apache/tomee/gradle/embedded/TomEEEmbeddedExtension.java @@ -65,7 +65,7 @@ public class TomEEEmbeddedExtension { private String dir; private String conf; - public Boolean isSkipDefaultRepository() { + public boolean isSkipDefaultRepository() { return skipDefaultRepository; } diff --git a/gradle/gradle-tomee-embedded/src/main/java/org/apache/tomee/gradle/embedded/TomEEEmbeddedPlugin.java b/gradle/gradle-tomee-embedded/src/main/java/org/apache/tomee/gradle/embedded/TomEEEmbeddedPlugin.java index a80078c7a3..3c373fa49a 100644 --- a/gradle/gradle-tomee-embedded/src/main/java/org/apache/tomee/gradle/embedded/TomEEEmbeddedPlugin.java +++ b/gradle/gradle-tomee-embedded/src/main/java/org/apache/tomee/gradle/embedded/TomEEEmbeddedPlugin.java @@ -52,7 +52,7 @@ public class TomEEEmbeddedPlugin implements Plugin<Project> { if (extension == null) { return; } - if (extension.isSkipDefaultRepository() != null && !extension.isSkipDefaultRepository()) { + if (!extension.isSkipDefaultRepository()) { actionProject.getRepositories().mavenCentral(); return; } diff --git a/gradle/gradle-tomee-embedded/src/main/java/org/apache/tomee/gradle/embedded/TomEEEmbeddedTask.java b/gradle/gradle-tomee-embedded/src/main/java/org/apache/tomee/gradle/embedded/TomEEEmbeddedTask.java index d06ea541e2..950eb59a9a 100644 --- a/gradle/gradle-tomee-embedded/src/main/java/org/apache/tomee/gradle/embedded/TomEEEmbeddedTask.java +++ b/gradle/gradle-tomee-embedded/src/main/java/org/apache/tomee/gradle/embedded/TomEEEmbeddedTask.java @@ -23,11 +23,12 @@ import org.gradle.api.Project; import org.gradle.api.artifacts.Configuration; import org.gradle.api.artifacts.UnknownConfigurationException; import org.gradle.api.tasks.Input; +import org.gradle.api.tasks.Internal; import org.gradle.api.tasks.Optional; import org.gradle.api.tasks.TaskAction; -import org.gradle.util.GFileUtils; import java.io.File; +import java.nio.file.Files; import java.lang.reflect.Field; import java.net.MalformedURLException; import java.net.URL; @@ -48,19 +49,15 @@ import static java.util.Arrays.asList; import static java.util.Collections.singletonList; public class TomEEEmbeddedTask extends DefaultTask { - @Optional @Input private int httpPort = 8080; - @Optional @Input private int httpsPort = 8443; - @Optional @Input private int ajpPort = 8009; - @Optional @Input private int stopPort = 8005; @@ -92,27 +89,20 @@ public class TomEEEmbeddedTask extends DefaultTask { @Input private String sslProtocol; - @Optional - @Input + @Internal private File serverXml; - @Optional - @Input private boolean singleClassloader = false; - @Optional @Input private boolean ssl = false; - @Optional @Input private boolean withEjbRemote = false; - @Optional @Input private boolean quickSession; - @Optional @Input private boolean skipHttp = false; @@ -120,15 +110,12 @@ public class TomEEEmbeddedTask extends DefaultTask { @Input private Collection<String> applicationScopes = new HashSet<>(asList("compile", "runtime")); - @Optional - @Input private Collection<String> classloaderFilteredPackages; @Optional @Input private Collection<String> customWebResources; - @Optional @Input private boolean webResourceCached = true; @@ -140,7 +127,6 @@ public class TomEEEmbeddedTask extends DefaultTask { @Input private Map<String, String> containerProperties; - @Optional @Input private boolean keepServerXmlAsThis = false; @@ -152,7 +138,6 @@ public class TomEEEmbeddedTask extends DefaultTask { @Input private Map<String, String> roles; - @Optional @Input private boolean forceJspDevelopment = true; @@ -164,24 +149,19 @@ public class TomEEEmbeddedTask extends DefaultTask { @Input private String inlinedTomEEXml; - @Optional - @Input + @Internal private File workDir; - @Optional - @Input + @Internal private List<File> modules; - @Optional - @Input + @Internal private File docBase; @Optional @Input private String dir; - @Optional - @Input private String conf; /* TODO if needed @@ -192,6 +172,7 @@ public class TomEEEmbeddedTask extends DefaultTask { private boolean withLiveReload; */ + @Internal private Configuration classpath; @TaskAction @@ -208,13 +189,18 @@ public class TomEEEmbeddedTask extends DefaultTask { } } + // Project.getBuildDir() is deprecated since Gradle 8 and gone in Gradle 9 + private static File buildDir(final Project project) { + return project.getLayout().getBuildDirectory().get().getAsFile(); + } + private void fixConfig() { final Project project = getProject(); // defaults if (classpath == null) { try { - classpath.add(project.getConfigurations().getByName(TomEEEmbeddedExtension.ALIAS).fileCollection()); + classpath = project.getConfigurations().getByName(TomEEEmbeddedExtension.ALIAS); } catch (final UnknownConfigurationException uce) { classpath = project.getConfigurations().getByName(TomEEEmbeddedExtension.NAME); } @@ -224,13 +210,13 @@ public class TomEEEmbeddedTask extends DefaultTask { docBase = new File(project.getProjectDir(), "src/main/webapp"); } if (workDir == null) { - workDir = new File(project.getBuildDir(), "tomee-embedded/work"); + workDir = new File(buildDir(project), "tomee-embedded/work"); } if (dir == null) { - dir = new File(project.getBuildDir(), "tomee-embedded/run").getAbsolutePath(); + dir = new File(buildDir(project), "tomee-embedded/run").getAbsolutePath(); } if (modules == null || modules.isEmpty()) { - final File main = new File(project.getBuildDir(), "classes/main"); + final File main = new File(buildDir(project), "classes/main"); if (main.isDirectory()) { modules = new ArrayList<>(singletonList(main)); } @@ -275,9 +261,9 @@ public class TomEEEmbeddedTask extends DefaultTask { throw new GradleException("you can't define a server.xml and an inlinedServerXml"); } try { - GFileUtils.mkdirs(workDir); + Files.createDirectories(workDir.toPath()); serverXml = new File(workDir, "server.xml_dump"); - GFileUtils.writeFile(inlinedServerXml, serverXml); + Files.writeString(serverXml.toPath(), inlinedServerXml); } catch (final Exception e) { throw new GradleException(e.getMessage(), e); } @@ -301,8 +287,8 @@ public class TomEEEmbeddedTask extends DefaultTask { if (inlinedTomEEXml != null && inlinedTomEEXml.trim().isEmpty()) { try { final File conf = new File(dir, "conf"); - GFileUtils.mkdirs(conf); - GFileUtils.writeFile(inlinedTomEEXml, new File(conf, "tomee.xml")); + Files.createDirectories(conf.toPath()); + Files.writeString(new File(conf, "tomee.xml").toPath(), inlinedTomEEXml); } catch (final Exception e) { throw new GradleException(e.getMessage(), e); } @@ -713,6 +699,21 @@ public class TomEEEmbeddedTask extends DefaultTask { this.classpath = classpath; } + @Internal + public boolean isSingleClassloader() { + return singleClassloader; + } + + @Internal + public String getConf() { + return conf; + } + + @Internal + public Collection<String> getClassloaderFilteredPackages() { + return classloaderFilteredPackages; + } + public void setSingleClassloader(final boolean singleClassloader) { this.singleClassloader = singleClassloader; } diff --git a/gradle/pom.xml b/gradle/pom.xml index 93c2dbb259..7475aeb0de 100644 --- a/gradle/pom.xml +++ b/gradle/pom.xml @@ -28,15 +28,29 @@ <name>TomEE :: Gradle Plugins</name> <packaging>pom</packaging> + <properties> + <version.gradle>8.11.1</version.gradle> + </properties> + <modules> <module>gradle-tomee-embedded</module> </modules> <dependencies> <dependency> - <groupId>org.gradle</groupId> - <artifactId>gradle-core</artifactId> - <version>3.0</version> + <!-- + The Gradle API as a Maven artifact, which is what gradleApi() gives a Gradle + build. org.gradle:gradle-core was never published past 6.1.1. + --> + <groupId>dev.gradleplugins</groupId> + <artifactId>gradle-api</artifactId> + <version>${version.gradle}</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-api</artifactId> + <version>${version.slf4j}</version> <scope>provided</scope> </dependency> <dependency> @@ -47,10 +61,4 @@ </dependency> </dependencies> - <repositories> - <repository> - <id>gradle-libs-releases-local</id> - <url>https://repo.gradle.org/gradle/libs-releases-local/</url> - </repository> - </repositories> </project>
