You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by gn...@apache.org on 2023/01/06 13:42:19 UTC

[maven-mvnd] 22/28: Add an option to specify the debug address and display info when starting (fixes #737) (#753)

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

gnodet pushed a commit to branch mvnd-0.9.x
in repository https://gitbox.apache.org/repos/asf/maven-mvnd.git

commit 5eebb89d8272a7bd0caec67976499b834c1f918e
Author: Guillaume Nodet <gn...@gmail.com>
AuthorDate: Fri Dec 16 08:39:39 2022 +0100

    Add an option to specify the debug address and display info when starting (fixes #737) (#753)
---
 .../org/mvndaemon/mvnd/client/DaemonConnector.java | 37 +++++++++++++++++++---
 .../org/mvndaemon/mvnd/common/Environment.java     |  7 ++++
 dist/src/main/distro/bin/mvnd-bash-completion.bash |  2 +-
 3 files changed, 40 insertions(+), 6 deletions(-)

diff --git a/client/src/main/java/org/mvndaemon/mvnd/client/DaemonConnector.java b/client/src/main/java/org/mvndaemon/mvnd/client/DaemonConnector.java
index 05558d13..8b867176 100644
--- a/client/src/main/java/org/mvndaemon/mvnd/client/DaemonConnector.java
+++ b/client/src/main/java/org/mvndaemon/mvnd/client/DaemonConnector.java
@@ -23,8 +23,10 @@ import static org.mvndaemon.mvnd.common.DaemonState.Canceled;
 
 import java.io.File;
 import java.io.IOException;
+import java.net.InetSocketAddress;
 import java.net.SocketAddress;
 import java.nio.ByteBuffer;
+import java.nio.channels.ServerSocketChannel;
 import java.nio.channels.SocketChannel;
 import java.nio.file.DirectoryStream;
 import java.nio.file.Files;
@@ -122,7 +124,7 @@ public class DaemonConnector {
         final String daemonId = newId();
         String message = handleStopEvents(daemonId, idleDaemons, busyDaemons);
         output.accept(Message.buildStatus(message));
-        return startDaemon(daemonId);
+        return startDaemon(daemonId, output);
     }
 
     private DaemonClientConnection connectNoDaemon() {
@@ -297,8 +299,8 @@ public class DaemonConnector {
         return null;
     }
 
-    public DaemonClientConnection startDaemon(String daemonId) {
-        final Process process = startDaemonProcess(daemonId);
+    public DaemonClientConnection startDaemon(String daemonId, ClientOutput output) {
+        final Process process = startDaemonProcess(daemonId, output);
         LOGGER.debug("Started Maven daemon {}", daemonId);
         long start = System.currentTimeMillis();
         do {
@@ -321,7 +323,7 @@ public class DaemonConnector {
         return String.format("%08x", new Random().nextInt());
     }
 
-    private Process startDaemonProcess(String daemonId) {
+    private Process startDaemonProcess(String daemonId, ClientOutput output) {
         final Path mvndHome = parameters.mvndHome();
         final Path workingDir = parameters.userDir();
         String command = "";
@@ -354,7 +356,32 @@ public class DaemonConnector {
             args.add("-javaagent:" + mvndAgentPath);
             // debug options
             if (parameters.property(Environment.MVND_DEBUG).asBoolean()) {
-                args.add("-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8000");
+                String address =
+                        parameters.property(Environment.MVND_DEBUG_ADDRESS).asString();
+                String host;
+                String port;
+                int column = address.indexOf(':');
+                if (column >= 0) {
+                    host = address.substring(0, column);
+                    port = address.substring(column + 1);
+                } else {
+                    host = "localhost";
+                    port = address;
+                }
+                if (!port.matches("[0-9]+")) {
+                    throw new IllegalArgumentException("Wrong debug address syntax: " + address);
+                }
+                int iPort = Integer.parseInt(port);
+                if (iPort == 0) {
+                    try (ServerSocketChannel channel = SocketFamily.inet.openServerSocket()) {
+                        iPort = ((InetSocketAddress) channel.getLocalAddress()).getPort();
+                    } catch (IOException e) {
+                        throw new IllegalStateException("Unable to find a free debug port", e);
+                    }
+                }
+                address = host + ":" + iPort;
+                output.accept(Message.buildStatus("Daemon listening for debugger on address: " + address));
+                args.add("-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=" + address);
             }
             // jvm args
             String jvmArgs = parameters.jvmArgs();
diff --git a/common/src/main/java/org/mvndaemon/mvnd/common/Environment.java b/common/src/main/java/org/mvndaemon/mvnd/common/Environment.java
index 95cd046e..a7477de0 100644
--- a/common/src/main/java/org/mvndaemon/mvnd/common/Environment.java
+++ b/common/src/main/java/org/mvndaemon/mvnd/common/Environment.java
@@ -169,6 +169,13 @@ public enum Environment {
      * not passed to the daemon.
      */
     MVND_DEBUG("mvnd.debug", null, Boolean.FALSE, OptionType.BOOLEAN, Flags.DISCRIMINATING),
+    /**
+     * The tcp address used to launch the debug mode. Defaults to <code>8000</code>, which is similar to
+     * <code>localhost:8000</code>.  In order to remote debug from a different computer, you need to allow
+     * remote connections using <code>*:8000</code> for example.  Use a port with a value of <code>0</code>
+     * to have <code>mvnd</code> to choose one.
+     */
+    MVND_DEBUG_ADDRESS("mvnd.debug.address", null, "8000", OptionType.STRING, Flags.DISCRIMINATING),
     /**
      * A time period after which an unused daemon will terminate by itself.
      */
diff --git a/dist/src/main/distro/bin/mvnd-bash-completion.bash b/dist/src/main/distro/bin/mvnd-bash-completion.bash
index 4b90feab..45ffc0d8 100644
--- a/dist/src/main/distro/bin/mvnd-bash-completion.bash
+++ b/dist/src/main/distro/bin/mvnd-bash-completion.bash
@@ -218,7 +218,7 @@ _mvnd()
 
     local mvnd_opts="-1"
     local mvnd_long_opts="--color|--completion|--purge|--serial|--status|--stop"
-    local mvnd_properties="-Djava.home|-Djdk.java.options|-Dmaven.multiModuleProjectDirectory|-Dmaven.repo.local|-Dmaven.settings|-Dmvnd.buildTime|-Dmvnd.builder|-Dmvnd.daemonStorage|-Dmvnd.debug|-Dmvnd.duplicateDaemonGracePeriod|-Dmvnd.enableAssertions|-Dmvnd.expirationCheckDelay|-Dmvnd.home|-Dmvnd.idleTimeout|-Dmvnd.jvmArgs|-Dmvnd.keepAlive|-Dmvnd.logPurgePeriod|-Dmvnd.logback|-Dmvnd.maxHeapSize|-Dmvnd.maxLostKeepAlive|-Dmvnd.minHeapSize|-Dmvnd.minThreads|-Dmvnd.noBuffering|-Dmvnd.noDa [...]
+    local mvnd_properties="-Djava.home|-Djdk.java.options|-Dmaven.multiModuleProjectDirectory|-Dmaven.repo.local|-Dmaven.settings|-Dmvnd.buildTime|-Dmvnd.builder|-Dmvnd.daemonStorage|-Dmvnd.debug|-Dmvnd.debug.address|-Dmvnd.duplicateDaemonGracePeriod|-Dmvnd.enableAssertions|-Dmvnd.expirationCheckDelay|-Dmvnd.home|-Dmvnd.idleTimeout|-Dmvnd.jvmArgs|-Dmvnd.keepAlive|-Dmvnd.logPurgePeriod|-Dmvnd.logback|-Dmvnd.maxHeapSize|-Dmvnd.maxLostKeepAlive|-Dmvnd.minHeapSize|-Dmvnd.minThreads|-Dmvnd.no [...]
     local opts="-am|-amd|-B|-C|-c|-cpu|-D|-e|-emp|-ep|-f|-fae|-ff|-fn|-gs|-h|-l|-N|-npr|-npu|-nsu|-o|-P|-pl|-q|-rf|-s|-T|-t|-U|-up|-V|-v|-X|${mvnd_opts}"
     local long_opts="--also-make|--also-make-dependents|--batch-mode|--strict-checksums|--lax-checksums|--check-plugin-updates|--define|--errors|--encrypt-master-password|--encrypt-password|--file|--fail-at-end|--fail-fast|--fail-never|--global-settings|--help|--log-file|--non-recursive|--no-plugin-registry|--no-plugin-updates|--no-snapshot-updates|--offline|--activate-profiles|--projects|--quiet|--resume-from|--settings|--threads|--toolchains|--update-snapshots|--update-plugins|--show-v [...]