This is an automated email from the ASF dual-hosted git repository.

rzo1 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tomee.git


The following commit(s) were added to refs/heads/main by this push:
     new 2cd5569ef0 TOMEE-4706 migrate the Gradle plugin to a current Gradle 
version
2cd5569ef0 is described below

commit 2cd5569ef0e0fa47b0ab3097520885db3ff827b2
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.
---
 .../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 b30140ddaa..dfca2e8b1d 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>

Reply via email to