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

slachiewicz pushed a commit to branch deprecation
in repository https://gitbox.apache.org/repos/asf/maven-invoker.git

commit ed96130a8eb3519040e27c82d0b0d5340a8d2e6a
Author: Sylwester Lachiewicz <[email protected]>
AuthorDate: Tue Dec 30 14:42:06 2025 +0000

    Mark maven-invoker component as deprecated
    
    Related: #164, apache/maven-verifier#186
---
 MIGRATION.md                                       | 294 +++++++++++++++++++++
 README.md                                          |  15 ++
 pom.xml                                            |  12 +-
 .../shared/invoker/DefaultInvocationRequest.java   |   7 +
 .../shared/invoker/DefaultInvocationResult.java    |   7 +
 .../maven/shared/invoker/DefaultInvoker.java       |   7 +
 .../maven/shared/invoker/InvocationRequest.java    |   7 +
 .../maven/shared/invoker/InvocationResult.java     |   7 +
 .../org/apache/maven/shared/invoker/Invoker.java   |   7 +
 .../apache/maven/shared/invoker/package-info.java  |  75 ++++++
 src/site/apt/index.apt.vm                          |  24 ++
 src/site/apt/migration.apt.vm                      | 263 ++++++++++++++++++
 src/site/apt/usage.apt.vm                          |   8 +
 src/site/site.xml                                  |   1 +
 .../maven/shared/invoker/DefaultInvokerTest.java   |   1 +
 .../invoker/MavenCommandLineBuilderTest.java       |   1 +
 .../maven/shared/invoker/SystemOutHandlerTest.java |   1 +
 .../maven/shared/invoker/SystemOutLoggerTest.java  |   1 +
 18 files changed, 737 insertions(+), 1 deletion(-)

diff --git a/MIGRATION.md b/MIGRATION.md
new file mode 100644
index 0000000..d984103
--- /dev/null
+++ b/MIGRATION.md
@@ -0,0 +1,294 @@
+<!---
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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.
+-->
+
+# Migration from maven-invoker to maven-executor
+
+## Overview
+
+The `maven-invoker` component is deprecated and replaced by 
[`maven-executor`](https://github.com/apache/maven/tree/master/impl/maven-executor),
 which provides a modern, unified API for programmatically invoking Maven 
builds.
+
+## Why Migrate?
+
+**maven-executor** offers several advantages:
+
+- **Unified API**: Simple, consistent API that doesn't require updates when 
Maven CLI changes
+- **Maven 3.9+ and Maven 4+ Support**: Works seamlessly with both Maven 
versions
+- **Multiple Execution Modes**: Supports both forked and embedded execution
+- **Better Environment Isolation**: Proper isolation of environment variables 
and system properties
+- **Zero Dependencies**: Completely standalone, no additional dependencies 
required
+- **Maintained**: Actively used in Maven 4 Integration Tests
+
+## Dependency Changes
+
+### Old (maven-invoker)
+
+```xml
+<dependency>
+    <groupId>org.apache.maven.shared</groupId>
+    <artifactId>maven-invoker</artifactId>
+</dependency>
+```
+
+### New (maven-executor)
+
+**Option 1: Using Maven 4+ (recommended)**
+
+```xml
+<dependency>
+    <groupId>org.apache.maven</groupId>
+    <artifactId>maven-executor</artifactId>
+    <version>4.0.0-rc5</version>
+</dependency>
+```
+
+> **Note**: Check the latest Maven 4 releases for current version numbers.
+
+## API Comparison and Migration Examples
+
+### Basic Invocation
+
+#### Old Code (maven-invoker)
+
+```java
+import org.apache.maven.shared.invoker.*;
+import java.io.File;
+import java.util.Collections;
+
+InvocationRequest request = new DefaultInvocationRequest();
+request.setPomFile(new File("/path/to/pom.xml"));
+request.setGoals(Collections.singletonList("install"));
+
+Invoker invoker = new DefaultInvoker();
+InvocationResult result = invoker.execute(request);
+
+if (result.getExitCode() != 0) {
+    throw new IllegalStateException("Build failed.");
+}
+```
+
+#### New Code (maven-executor)
+
+```java
+import org.apache.maven.api.cli.*;
+import org.apache.maven.cling.executor.*;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+// Using forked executor
+ExecutorRequest request = ExecutorRequest.builder()
+    .cwd(Paths.get("/path/to"))
+    .command("mvn")
+    .args(new String[]{"install"})
+    .build();
+
+ForkedExecutor executor = new ForkedExecutor();
+int exitCode = executor.execute(request);
+
+if (exitCode != 0) {
+    throw new IllegalStateException("Build failed.");
+}
+```
+
+### Setting Goals and Options
+
+#### Old Code (maven-invoker)
+
+```java
+InvocationRequest request = new DefaultInvocationRequest();
+request.setPomFile(new File("/path/to/pom.xml"));
+request.setGoals(Arrays.asList("clean", "install"));
+request.setBatchMode(true);
+request.setOffline(true);
+request.setDebug(true);
+request.setProperties(properties);
+```
+
+#### New Code (maven-executor)
+
+```java
+ExecutorRequest request = ExecutorRequest.builder()
+    .cwd(Paths.get("/path/to"))
+    .command("mvn")
+    .args(new String[]{
+        "clean", "install",
+        "--batch-mode",
+        "--offline",
+        "--debug",
+        "-Dproperty1=value1",
+        "-Dproperty2=value2"
+    })
+    .build();
+```
+
+### Maven Home Configuration
+
+#### Old Code (maven-invoker)
+
+```java
+Invoker invoker = new DefaultInvoker();
+invoker.setMavenHome(new File("/path/to/maven"));
+```
+
+#### New Code (maven-executor)
+
+```java
+// Maven home is automatically detected from MAVEN_HOME or M2_HOME
+// or can be specified via command path
+ExecutorRequest request = ExecutorRequest.builder()
+    .command("/path/to/maven/bin/mvn")
+    .args(new String[]{"install"})
+    .build();
+```
+
+### Local Repository Configuration
+
+#### Old Code (maven-invoker)
+
+```java
+InvocationRequest request = new DefaultInvocationRequest();
+request.setLocalRepositoryDirectory(new File("/path/to/local/repo"));
+```
+
+#### New Code (maven-executor)
+
+```java
+ExecutorRequest request = ExecutorRequest.builder()
+    .args(new String[]{
+        "install",
+        "-Dmaven.repo.local=/path/to/local/repo"
+    })
+    .build();
+```
+
+### Capturing Output
+
+#### Old Code (maven-invoker)
+
+```java
+InvocationOutputHandler outputHandler = new InvocationOutputHandler() {
+    @Override
+    public void consumeLine(String line) {
+        System.out.println(line);
+    }
+};
+
+InvocationRequest request = new DefaultInvocationRequest();
+request.setOutputHandler(outputHandler);
+```
+
+#### New Code (maven-executor)
+
+```java
+// Output handling through standard Java ProcessBuilder mechanisms
+ProcessBuilder.Redirect redirect = ProcessBuilder.Redirect.PIPE;
+
+// Or use custom output streams
+ExecutorRequest request = ExecutorRequest.builder()
+    .args(new String[]{"install"})
+    .outputRedirect(yourOutputStream)
+    .build();
+```
+
+### Embedded Execution
+
+#### Old Code (maven-invoker)
+
+```java
+// maven-invoker only supports forked execution
+```
+
+#### New Code (maven-executor)
+
+```java
+// maven-executor supports embedded execution!
+import org.apache.maven.cling.executor.EmbeddedExecutor;
+
+EmbeddedExecutor executor = new EmbeddedExecutor();
+ExecutorRequest request = ExecutorRequest.builder()
+    .cwd(Paths.get("/path/to/project"))
+    .args(new String[]{"install"})
+    .build();
+
+int exitCode = executor.execute(request);
+```
+
+### Environment Variables
+
+#### Old Code (maven-invoker)
+
+```java
+InvocationRequest request = new DefaultInvocationRequest();
+request.setShellEnvironmentInherited(true);
+// or
+request.addShellEnvironment("MY_VAR", "value");
+```
+
+#### New Code (maven-executor)
+
+```java
+Map<String, String> env = new HashMap<>();
+env.put("MY_VAR", "value");
+
+ExecutorRequest request = ExecutorRequest.builder()
+    .args(new String[]{"install"})
+    .environment(env)
+    .build();
+```
+
+## Complete Migration Checklist
+
+- [ ] Update dependencies in `pom.xml`
+- [ ] Replace `InvocationRequest` with `ExecutorRequest`
+- [ ] Replace `Invoker` with `ForkedExecutor` or `EmbeddedExecutor`
+- [ ] Convert file paths from `File` to `Path`/`Paths`
+- [ ] Convert goals and options to command-line arguments array
+- [ ] Update output handling mechanism
+- [ ] Update environment variable handling
+- [ ] Update system property handling
+- [ ] Update test configurations
+- [ ] Verify Maven home detection or configuration
+- [ ] Test with both Maven 3.9+ and Maven 4+ if needed
+
+## Key Differences Summary
+
+| Feature | maven-invoker | maven-executor |
+|---------|--------------|----------------|
+| API Style | Request/Invoker objects | Builder pattern with args array |
+| Maven Versions | Maven 2.x, 3.x | Maven 3.9+, 4+ |
+| Execution Modes | Forked only | Forked and Embedded |
+| Dependencies | Has dependencies | Zero dependencies |
+| CLI Mapping | Manual mapping in code | Direct CLI args |
+| Maintenance | Requires updates for CLI changes | No updates needed for CLI 
changes |
+
+## Additional Resources
+
+- [maven-executor source 
code](https://github.com/apache/maven/tree/master/impl/maven-executor)
+- [maven-executor CLI 
API](https://github.com/apache/maven/tree/master/impl/maven-executor/src/main/java/org/apache/maven/api/cli)
+- [maven-executor 
implementation](https://github.com/apache/maven/tree/master/impl/maven-executor/src/main/java/org/apache/maven/cling/executor)
+- [Maven 4 Integration Tests using 
maven-executor](https://github.com/apache/maven/blob/master/its/core-it-support/maven-it-helper/src/main/java/org/apache/maven/it/Verifier.java)
+- [Issue #164 - Deprecation 
announcement](https://github.com/apache/maven-invoker/issues/164)
+- [Related discussion in 
maven-verifier](https://github.com/apache/maven-verifier/issues/186)
+
+## Need Help?
+
+If you encounter migration issues or have questions:
+
+1. Check the [maven-executor source 
code](https://github.com/apache/maven/tree/master/impl/maven-executor) for 
examples
+2. Review [Maven 4 IT tests](https://github.com/apache/maven/tree/master/its) 
that use maven-executor
+3. Open an issue on the [maven-invoker 
repository](https://github.com/apache/maven-invoker/issues) for 
migration-specific questions
+4. Contact the [Maven developer mailing 
list](https://maven.apache.org/mailing-lists.html)
+
diff --git a/README.md b/README.md
index 9ffe789..3bf6402 100644
--- a/README.md
+++ b/README.md
@@ -17,6 +17,21 @@
 Contributing to [Apache Maven 
Invoker](https://maven.apache.org/shared/maven-invoker/)
 ======================
 
+> **⚠️ DEPRECATION NOTICE**
+>
+> This project is **deprecated** and will be replaced by 
[**maven-executor**](https://github.com/apache/maven/tree/master/impl/maven-executor).
+>
+> **Users should migrate to maven-executor**, which offers:
+> - Unified and simpler API that doesn't require updates when Maven CLI changes
+> - Support for both Maven 3.9+ and Maven 4+
+> - Both forked and embedded execution modes
+> - Proper environment isolation
+> - Zero dependencies
+>
+> For migration guidance, see [MIGRATION.md](MIGRATION.md).
+>
+> **Related:** [Issue #164](https://github.com/apache/maven-invoker/issues/164)
+
 [![Apache License, Version 2.0, January 
2004](https://img.shields.io/github/license/apache/maven.svg?label=License)][license]
 [![Maven 
Central](https://img.shields.io/maven-central/v/org.apache.maven.shared/maven-invoker.svg?label=Maven%20Central)](https://search.maven.org/artifact/org.apache.maven.shared/maven-invoker)
 [![Reproducible 
Builds](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/jvm-repo-rebuild/reproducible-central/master/content/org/apache/maven/shared/maven-invoker/badge.json)](https://github.com/jvm-repo-rebuild/reproducible-central/blob/master/content/org/apache/maven/shared/maven-invoker/README.md)
diff --git a/pom.xml b/pom.xml
index 79a219c..0317945 100644
--- a/pom.xml
+++ b/pom.xml
@@ -31,7 +31,7 @@ under the License.
   <version>3.3.1-SNAPSHOT</version>
 
   <name>Apache Maven Invoker</name>
-  <description>A component to programmatically invoke Maven.</description>
+  <description>DEPRECATED: This component is deprecated and replaced by 
maven-executor 
(https://github.com/apache/maven/tree/master/impl/maven-executor). Please 
migrate to maven-executor for Maven 3.9+ and Maven 4+ support with improved API 
and features.</description>
 
   <contributors>
     <contributor>
@@ -95,6 +95,16 @@ under the License.
     </testResources>
 
     <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <configuration>
+          <!-- Show deprecation warnings during compilation -->
+          <compilerArgs>
+            <arg>-Xlint:deprecation</arg>
+          </compilerArgs>
+        </configuration>
+      </plugin>
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-surefire-plugin</artifactId>
diff --git 
a/src/main/java/org/apache/maven/shared/invoker/DefaultInvocationRequest.java 
b/src/main/java/org/apache/maven/shared/invoker/DefaultInvocationRequest.java
index f26f100..e4cf490 100644
--- 
a/src/main/java/org/apache/maven/shared/invoker/DefaultInvocationRequest.java
+++ 
b/src/main/java/org/apache/maven/shared/invoker/DefaultInvocationRequest.java
@@ -31,7 +31,14 @@ import java.util.Properties;
 /**
  * Specifies the parameters used to control a Maven invocation.
  *
+ * @deprecated This class is deprecated. Use
+ *             <a 
href="https://github.com/apache/maven/tree/master/impl/maven-executor";>maven-executor</a>
+ *             ExecutorRequest.builder() instead.
+ *             See the <a 
href="https://maven.apache.org/shared/maven-invoker/migration.html";>Migration 
Guide</a>
+ *             for details.
+ * @see <a href="https://github.com/apache/maven-invoker/issues/164";>Issue 
#164</a>
  */
+@Deprecated
 public class DefaultInvocationRequest implements InvocationRequest {
 
     private File basedir;
diff --git 
a/src/main/java/org/apache/maven/shared/invoker/DefaultInvocationResult.java 
b/src/main/java/org/apache/maven/shared/invoker/DefaultInvocationResult.java
index cc22f75..eff08a7 100644
--- a/src/main/java/org/apache/maven/shared/invoker/DefaultInvocationResult.java
+++ b/src/main/java/org/apache/maven/shared/invoker/DefaultInvocationResult.java
@@ -23,7 +23,14 @@ import 
org.apache.maven.shared.utils.cli.CommandLineException;
 /**
  * Describes the result of a Maven invocation.
  *
+ * @deprecated This class is deprecated. Use
+ *             <a 
href="https://github.com/apache/maven/tree/master/impl/maven-executor";>maven-executor</a>
+ *             instead.
+ *             See the <a 
href="https://maven.apache.org/shared/maven-invoker/migration.html";>Migration 
Guide</a>
+ *             for details.
+ * @see <a href="https://github.com/apache/maven-invoker/issues/164";>Issue 
#164</a>
  */
+@Deprecated
 public final class DefaultInvocationResult implements InvocationResult {
 
     /**
diff --git a/src/main/java/org/apache/maven/shared/invoker/DefaultInvoker.java 
b/src/main/java/org/apache/maven/shared/invoker/DefaultInvoker.java
index 80c5939..9d9375f 100644
--- a/src/main/java/org/apache/maven/shared/invoker/DefaultInvoker.java
+++ b/src/main/java/org/apache/maven/shared/invoker/DefaultInvoker.java
@@ -31,8 +31,15 @@ import org.apache.maven.shared.utils.cli.Commandline;
 /**
  * Class intended to be used by clients who wish to invoke a forked Maven 
process from their applications
  *
+ * @deprecated This class is deprecated. Use
+ *             <a 
href="https://github.com/apache/maven/tree/master/impl/maven-executor";>maven-executor</a>
+ *             ForkedExecutor or EmbeddedExecutor instead.
+ *             See the <a 
href="https://maven.apache.org/shared/maven-invoker/migration.html";>Migration 
Guide</a>
+ *             for details.
  * @author jdcasey
+ * @see <a href="https://github.com/apache/maven-invoker/issues/164";>Issue 
#164</a>
  */
+@Deprecated
 @Named
 @Singleton
 public class DefaultInvoker implements Invoker {
diff --git 
a/src/main/java/org/apache/maven/shared/invoker/InvocationRequest.java 
b/src/main/java/org/apache/maven/shared/invoker/InvocationRequest.java
index 0c41043..2c7be47 100644
--- a/src/main/java/org/apache/maven/shared/invoker/InvocationRequest.java
+++ b/src/main/java/org/apache/maven/shared/invoker/InvocationRequest.java
@@ -28,7 +28,14 @@ import java.util.Properties;
 /**
  * Specifies the parameters used to control a Maven invocation.
  *
+ * @deprecated This interface is deprecated. Use
+ *             <a 
href="https://github.com/apache/maven/tree/master/impl/maven-executor";>maven-executor</a>
+ *             ExecutorRequest instead, which uses a builder pattern and 
direct CLI arguments.
+ *             See the <a 
href="https://maven.apache.org/shared/maven-invoker/migration.html";>Migration 
Guide</a>
+ *             for details.
+ * @see <a href="https://github.com/apache/maven-invoker/issues/164";>Issue 
#164</a>
  */
+@Deprecated
 public interface InvocationRequest {
 
     /**
diff --git 
a/src/main/java/org/apache/maven/shared/invoker/InvocationResult.java 
b/src/main/java/org/apache/maven/shared/invoker/InvocationResult.java
index 062177a..8db839c 100644
--- a/src/main/java/org/apache/maven/shared/invoker/InvocationResult.java
+++ b/src/main/java/org/apache/maven/shared/invoker/InvocationResult.java
@@ -23,8 +23,15 @@ import 
org.apache.maven.shared.utils.cli.CommandLineException;
 /**
  * Describes the result of a Maven invocation.
  *
+ * @deprecated This interface is deprecated. Use
+ *             <a 
href="https://github.com/apache/maven/tree/master/impl/maven-executor";>maven-executor</a>
+ *             which returns exit codes directly.
+ *             See the <a 
href="https://maven.apache.org/shared/maven-invoker/migration.html";>Migration 
Guide</a>
+ *             for details.
  * @author jdcasey
+ * @see <a href="https://github.com/apache/maven-invoker/issues/164";>Issue 
#164</a>
  */
+@Deprecated
 public interface InvocationResult {
 
     /**
diff --git a/src/main/java/org/apache/maven/shared/invoker/Invoker.java 
b/src/main/java/org/apache/maven/shared/invoker/Invoker.java
index f5e1369..bb2263e 100644
--- a/src/main/java/org/apache/maven/shared/invoker/Invoker.java
+++ b/src/main/java/org/apache/maven/shared/invoker/Invoker.java
@@ -24,7 +24,14 @@ import java.io.InputStream;
 /**
  * Provides a facade to invoke Maven.
  *
+ * @deprecated This component is deprecated. Use
+ *             <a 
href="https://github.com/apache/maven/tree/master/impl/maven-executor";>maven-executor</a>
+ *             instead, which provides better Maven 3.9+ and Maven 4+ support 
with a unified API.
+ *             See the <a 
href="https://maven.apache.org/shared/maven-invoker/migration.html";>Migration 
Guide</a>
+ *             for details.
+ * @see <a href="https://github.com/apache/maven-invoker/issues/164";>Issue 
#164</a>
  */
+@Deprecated
 public interface Invoker {
 
     /**
diff --git a/src/main/java/org/apache/maven/shared/invoker/package-info.java 
b/src/main/java/org/apache/maven/shared/invoker/package-info.java
new file mode 100644
index 0000000..8722305
--- /dev/null
+++ b/src/main/java/org/apache/maven/shared/invoker/package-info.java
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+/**
+ * <p><strong>DEPRECATED:</strong> This package is deprecated and will be 
replaced by
+ * <a 
href="https://github.com/apache/maven/tree/master/impl/maven-executor";>maven-executor</a>.</p>
+ *
+ * <p>The {@code maven-invoker} component provides an API for programmatically 
invoking Maven builds.
+ * However, it is being replaced by {@code maven-executor} which offers 
significant improvements:</p>
+ *
+ * <h2>Why Migrate to maven-executor?</h2>
+ * <ul>
+ *   <li><strong>Unified and Simpler API:</strong> No need for updates when 
Maven CLI changes</li>
+ *   <li><strong>Modern Maven Support:</strong> Works with both Maven 3.9+ and 
Maven 4+</li>
+ *   <li><strong>Flexible Execution:</strong> Supports both forked and 
embedded execution modes</li>
+ *   <li><strong>Better Isolation:</strong> Proper environment and system 
property isolation</li>
+ *   <li><strong>Zero Dependencies:</strong> Completely standalone library</li>
+ *   <li><strong>Actively Maintained:</strong> Used in Maven 4 Integration 
Tests</li>
+ * </ul>
+ *
+ * <h2>Migration</h2>
+ * <p>For detailed migration instructions, including code examples and API 
comparisons, see the
+ * <a 
href="https://maven.apache.org/shared/maven-invoker/migration.html";>Migration 
Guide</a>.</p>
+ *
+ * <h2>Quick Example</h2>
+ * <p>Old code (maven-invoker):</p>
+ * <pre>{@code
+ * InvocationRequest request = new DefaultInvocationRequest();
+ * request.setPomFile(new File("/path/to/pom.xml"));
+ * request.setGoals(Collections.singletonList("install"));
+ *
+ * Invoker invoker = new DefaultInvoker();
+ * InvocationResult result = invoker.execute(request);
+ * }</pre>
+ *
+ * <p>New code (maven-executor):</p>
+ * <pre>{@code
+ * ExecutorRequest request = ExecutorRequest.builder()
+ *     .cwd(Paths.get("/path/to"))
+ *     .command("mvn")
+ *     .args(new String[]{"install"})
+ *     .build();
+ *
+ * ForkedExecutor executor = new ForkedExecutor();
+ * int exitCode = executor.execute(request);
+ * }</pre>
+ *
+ * <h2>Support</h2>
+ * <ul>
+ *   <li><a href="https://github.com/apache/maven-invoker/issues/164";>Issue 
#164 - Deprecation Announcement</a></li>
+ *   <li><a 
href="https://github.com/apache/maven/tree/master/impl/maven-executor";>maven-executor
 Source Code</a></li>
+ *   <li><a href="https://maven.apache.org/mailing-lists.html";>Maven Mailing 
Lists</a></li>
+ * </ul>
+ *
+ * @deprecated Use <a 
href="https://github.com/apache/maven/tree/master/impl/maven-executor";>maven-executor</a>
+ *             instead. This package will be removed in a future version.
+ */
+@Deprecated
+package org.apache.maven.shared.invoker;
diff --git a/src/site/apt/index.apt.vm b/src/site/apt/index.apt.vm
index b4cf515..2a4b405 100644
--- a/src/site/apt/index.apt.vm
+++ b/src/site/apt/index.apt.vm
@@ -28,6 +28,30 @@
 
 ${project.name}
 
+%{color:red}*DEPRECATION NOTICE*
+
+  *This project is deprecated and will be replaced by 
{{{https://github.com/apache/maven/tree/master/impl/maven-executor}maven-executor}}.*
+
+  Users should migrate to maven-executor, which offers:
+
+  * Unified and simpler API that doesn't require updates when Maven CLI changes
+
+  * Support for both Maven 3.9+ and Maven 4+
+
+  * Both forked and embedded execution modes
+
+  * Proper environment isolation
+
+  * Zero dependencies
+
+  See {{{./migration.html}Migration Guide}} for details.
+
+  Related: {{{https://github.com/apache/maven-invoker/issues/164}Issue #164}}
+
+* * *
+
+* Overview
+
   In many cases, tools (including Maven itself) may want to fire off a Maven
   build in a clean environment. Why? Perhaps you want to avoid polluting the
   current system environment with side-effects produced by Maven plugins. Maybe
diff --git a/src/site/apt/migration.apt.vm b/src/site/apt/migration.apt.vm
new file mode 100644
index 0000000..4c01ff3
--- /dev/null
+++ b/src/site/apt/migration.apt.vm
@@ -0,0 +1,263 @@
+  ---
+  Migration to maven-executor
+  ---
+  ---
+  2025-12-30
+  ---
+
+ ~~ Licensed to the Apache Software Foundation (ASF) under one
+ ~~ or more contributor license agreements.  See the NOTICE file
+ ~~ distributed with this work for additional information
+ ~~ regarding copyright ownership.  The ASF licenses this file
+ ~~ to you 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.
+
+ ~~ NOTE: For help with the syntax of this file, see:
+ ~~ http://maven.apache.org/doxia/references/apt-format.html
+
+Migration from maven-invoker to maven-executor
+
+* Overview
+
+  The <<<maven-invoker>>> component is deprecated and replaced by
+  
{{{https://github.com/apache/maven/tree/master/impl/maven-executor}maven-executor}},
+  which provides a modern, unified API for programmatically invoking Maven 
builds.
+
+* Why Migrate?
+
+  <<<maven-executor>>> offers several advantages:
+
+  * Unified API: Simple, consistent API that doesn't require updates when 
Maven CLI changes
+
+  * Maven 3.9+ and Maven 4+ Support: Works seamlessly with both Maven versions
+
+  * Multiple Execution Modes: Supports both forked and embedded execution
+
+  * Better Environment Isolation: Proper isolation of environment variables 
and system properties
+
+  * Zero Dependencies: Completely standalone, no additional dependencies 
required
+
+  * Maintained: Actively used in Maven 4 Integration Tests
+
+  []
+
+* Dependency Changes
+
+** Old (maven-invoker)
+
++---+
+<dependency>
+    <groupId>org.apache.maven.shared</groupId>
+    <artifactId>maven-invoker</artifactId>
+</dependency>
++---+
+
+** New (maven-executor)
+
++---+
+<dependency>
+    <groupId>org.apache.maven</groupId>
+    <artifactId>maven-executor</artifactId>
+    <version>4.0.0-rc5</version>
+</dependency>
++---+
+
+  <<Note:>> Since maven-executor is part of Maven 4, check the latest Maven 4 
releases for
+  current version numbers. The component may be moved to a standalone project 
in the future.
+
+* API Comparison
+
+** Basic Invocation
+
+  Old Code (maven-invoker):
+
++---+
+InvocationRequest request = new DefaultInvocationRequest();
+request.setPomFile(new File("/path/to/pom.xml"));
+request.setGoals(Collections.singletonList("install"));
+
+Invoker invoker = new DefaultInvoker();
+InvocationResult result = invoker.execute(request);
+
+if (result.getExitCode() != 0) {
+    throw new IllegalStateException("Build failed.");
+}
++---+
+
+  New Code (maven-executor):
+
++---+
+ExecutorRequest request = ExecutorRequest.builder()
+    .cwd(Paths.get("/path/to"))
+    .command("mvn")
+    .args(new String[]{"install"})
+    .build();
+
+ForkedExecutor executor = new ForkedExecutor();
+int exitCode = executor.execute(request);
+
+if (exitCode != 0) {
+    throw new IllegalStateException("Build failed.");
+}
++---+
+
+** Setting Goals and Options
+
+  Old Code (maven-invoker):
+
++---+
+InvocationRequest request = new DefaultInvocationRequest();
+request.setPomFile(new File("/path/to/pom.xml"));
+request.setGoals(Arrays.asList("clean", "install"));
+request.setBatchMode(true);
+request.setOffline(true);
+request.setDebug(true);
++---+
+
+  New Code (maven-executor):
+
++---+
+ExecutorRequest request = ExecutorRequest.builder()
+    .cwd(Paths.get("/path/to"))
+    .command("mvn")
+    .args(new String[]{
+        "clean", "install",
+        "--batch-mode",
+        "--offline",
+        "--debug"
+    })
+    .build();
++---+
+
+** Embedded Execution
+
+  maven-invoker only supports forked execution, while maven-executor supports 
both!
+
++---+
+import org.apache.maven.cling.executor.EmbeddedExecutor;
+
+EmbeddedExecutor executor = new EmbeddedExecutor();
+ExecutorRequest request = ExecutorRequest.builder()
+    .cwd(Paths.get("/path/to/project"))
+    .args(new String[]{"install"})
+    .build();
+
+int exitCode = executor.execute(request);
++---+
+
+* Complete Migration Example
+
+  Before (maven-invoker):
+
++---+
+import org.apache.maven.shared.invoker.*;
+import java.io.File;
+import java.util.Arrays;
+import java.util.Properties;
+
+public class MavenBuildRunner {
+    private final Invoker invoker;
+
+    public MavenBuildRunner(File localRepo) {
+        Invoker newInvoker = new DefaultInvoker();
+        newInvoker.setLocalRepositoryDirectory(localRepo);
+        this.invoker = newInvoker;
+    }
+
+    public void runBuild(File projectDir) throws Exception {
+        InvocationRequest request = new DefaultInvocationRequest();
+        request.setBaseDirectory(projectDir);
+        request.setGoals(Arrays.asList("clean", "install"));
+        request.setBatchMode(true);
+
+        Properties props = new Properties();
+        props.setProperty("skipTests", "false");
+        request.setProperties(props);
+
+        InvocationResult result = invoker.execute(request);
+
+        if (result.getExitCode() != 0) {
+            throw new Exception("Build failed");
+        }
+    }
+}
++---+
+
+  After (maven-executor):
+
++---+
+import org.apache.maven.api.cli.*;
+import org.apache.maven.cling.executor.*;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.List;
+
+public class MavenBuildRunner {
+    private final ForkedExecutor executor;
+    private final Path localRepo;
+
+    public MavenBuildRunner(Path localRepo) {
+        this.executor = new ForkedExecutor();
+        this.localRepo = localRepo;
+    }
+
+    public void runBuild(Path projectDir) throws Exception {
+        List<String> args = new ArrayList<>();
+        args.add("clean");
+        args.add("install");
+        args.add("--batch-mode");
+        args.add("-Dmaven.repo.local=" + localRepo.toString());
+        args.add("-DskipTests=false");
+
+        ExecutorRequest request = ExecutorRequest.builder()
+            .cwd(projectDir)
+            .command("mvn")
+            .args(args.toArray(new String[0]))
+            .build();
+
+        int exitCode = executor.execute(request);
+
+        if (exitCode != 0) {
+            throw new Exception("Build failed");
+        }
+    }
+}
++---+
+
+* Additional Resources
+
+  * 
{{{https://github.com/apache/maven/tree/master/impl/maven-executor}maven-executor
 source code}}
+
+  * {{{https://github.com/apache/maven-invoker/issues/164}Issue #164 - 
Deprecation announcement}}
+
+  * {{{https://github.com/apache/maven-verifier/issues/186}Related discussion 
in maven-verifier}}
+
+  * {{{https://maven.apache.org/mailing-lists.html}Maven developer mailing 
list}}
+
+  * {{{./MIGRATION.md}Detailed Migration Guide (MIGRATION.md)}}
+
+  []
+
+* Need Help?
+
+  If you encounter migration issues or have questions:
+
+  [[1]] Check the 
{{{https://github.com/apache/maven/tree/master/impl/maven-executor}maven-executor
 source code}} for examples
+
+  [[2]] Review {{{https://github.com/apache/maven/tree/master/its}Maven 4 IT 
tests}} that use maven-executor
+
+  [[3]] Open an issue on the 
{{{https://github.com/apache/maven-invoker/issues}maven-invoker repository}}
+
+  [[4]] Contact the {{{https://maven.apache.org/mailing-lists.html}Maven 
developer mailing list}}
+
+  []
diff --git a/src/site/apt/usage.apt.vm b/src/site/apt/usage.apt.vm
index 5ca62ea..bc3d1a5 100644
--- a/src/site/apt/usage.apt.vm
+++ b/src/site/apt/usage.apt.vm
@@ -28,6 +28,14 @@
 
 Usage
 
+%{color:red}*DEPRECATION NOTICE*
+
+  *This project is deprecated.* Please migrate to 
{{{https://github.com/apache/maven/tree/master/impl/maven-executor}maven-executor}}.
+  
+  See {{{./migration.html}Migration Guide}} for details.
+
+* * *
+
   This page documents the basic usage of the Maven invocation API.
 
 * Hello, World
diff --git a/src/site/site.xml b/src/site/site.xml
index 2ae2acd..d9dc7e0 100644
--- a/src/site/site.xml
+++ b/src/site/site.xml
@@ -24,6 +24,7 @@ under the License.
   <body>
     <menu name="Overview">
       <item name="Introduction" href="index.html"/>
+      <item name="⚠️ Migration Guide" href="migration.html"/>
       <item name="Usage" href="usage.html"/>
       <item name="JavaDocs" href="apidocs/index.html"/>
       <item name="Source Xref" href="xref/index.html"/>
diff --git 
a/src/test/java/org/apache/maven/shared/invoker/DefaultInvokerTest.java 
b/src/test/java/org/apache/maven/shared/invoker/DefaultInvokerTest.java
index b6ca6dd..7bafb2a 100644
--- a/src/test/java/org/apache/maven/shared/invoker/DefaultInvokerTest.java
+++ b/src/test/java/org/apache/maven/shared/invoker/DefaultInvokerTest.java
@@ -36,6 +36,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
+@SuppressWarnings("deprecation")
 class DefaultInvokerTest {
 
     private final Invoker invoker = newInvoker();
diff --git 
a/src/test/java/org/apache/maven/shared/invoker/MavenCommandLineBuilderTest.java
 
b/src/test/java/org/apache/maven/shared/invoker/MavenCommandLineBuilderTest.java
index 881f8de..030ad41 100644
--- 
a/src/test/java/org/apache/maven/shared/invoker/MavenCommandLineBuilderTest.java
+++ 
b/src/test/java/org/apache/maven/shared/invoker/MavenCommandLineBuilderTest.java
@@ -48,6 +48,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.api.Assumptions.assumeTrue;
 
+@SuppressWarnings("deprecation")
 class MavenCommandLineBuilderTest {
     @TempDir
     private Path temporaryFolder;
diff --git 
a/src/test/java/org/apache/maven/shared/invoker/SystemOutHandlerTest.java 
b/src/test/java/org/apache/maven/shared/invoker/SystemOutHandlerTest.java
index b1d896e..b023254 100644
--- a/src/test/java/org/apache/maven/shared/invoker/SystemOutHandlerTest.java
+++ b/src/test/java/org/apache/maven/shared/invoker/SystemOutHandlerTest.java
@@ -20,6 +20,7 @@ package org.apache.maven.shared.invoker;
 
 import org.junit.jupiter.api.Test;
 
+@SuppressWarnings("deprecation")
 class SystemOutHandlerTest {
 
     @Test
diff --git 
a/src/test/java/org/apache/maven/shared/invoker/SystemOutLoggerTest.java 
b/src/test/java/org/apache/maven/shared/invoker/SystemOutLoggerTest.java
index 0e4ae3b..e03b8d9 100644
--- a/src/test/java/org/apache/maven/shared/invoker/SystemOutLoggerTest.java
+++ b/src/test/java/org/apache/maven/shared/invoker/SystemOutLoggerTest.java
@@ -26,6 +26,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
+@SuppressWarnings("deprecation")
 class SystemOutLoggerTest {
 
     private static final Throwable EXCEPTION =


Reply via email to