[ 
https://issues.apache.org/jira/browse/MNG-7541?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17764872#comment-17764872
 ] 

ASF GitHub Bot commented on MNG-7541:
-------------------------------------

Giovds commented on code in PR #982:
URL: https://github.com/apache/maven/pull/982#discussion_r1324860640


##########
apache-maven/src/bin/mvn.ps1:
##########
@@ -0,0 +1,158 @@
+<#
+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.
+
+-----------------------------------------------------------------------------
+Apache Maven Startup Script
+
+Environment Variable Prerequisites
+
+  JAVA_HOME       (Optional) Points to a Java installation.
+  MAVEN_ARGS      (Optional) Arguments passed to Maven before CLI arguments.
+  MAVEN_OPTS      (Optional) Java runtime options used when Maven is executed.
+  MAVEN_SKIP_RC   (Optional) Flag to disable loading of mavenrc files.
+-----------------------------------------------------------------------------
+#>
+
+# set title
+$Host.UI.RawUI.WindowTitle = (Get-Variable MyInvocation -Scope 
Script).Value.InvocationName

Review Comment:
   It would be nice to reset the title, otherwise your shell will keep showing 
`some-path\mvn.p1` long after maven is done unless you open a new window. It 
could also act as a visual indication maven is done if you have multiple tabs 
open. 



##########
apache-maven/src/bin/mvn.ps1:
##########
@@ -0,0 +1,158 @@
+<#
+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.
+
+-----------------------------------------------------------------------------
+Apache Maven Startup Script
+
+Environment Variable Prerequisites
+
+  JAVA_HOME       (Optional) Points to a Java installation.
+  MAVEN_ARGS      (Optional) Arguments passed to Maven before CLI arguments.
+  MAVEN_OPTS      (Optional) Java runtime options used when Maven is executed.
+  MAVEN_SKIP_RC   (Optional) Flag to disable loading of mavenrc files.
+-----------------------------------------------------------------------------
+#>
+
+# set title
+$Host.UI.RawUI.WindowTitle = (Get-Variable MyInvocation -Scope 
Script).Value.InvocationName
+
+if (-not $env:MAVEN_SKIP_RC) {
+  if (Test-Path -Path $env:PROGRAMDATA\mavenrc.ps1 -PathType Leaf) { 
&$env:PROGRAMDATA"\mavenrc.ps1" $args }
+  if (Test-Path -Path $env:USERPROFILE\mavenrc.ps1 -PathType Leaf) { 
&$env:USERPROFILE"\mavenrc.ps1" $args }
+}
+
+if (-not (Test-path $env:JAVA_HOME)) {
+  $JAVACMD = (get-command java).Source 

Review Comment:
   I'm pretty sure `Get-Command` throws an exception if a command is not found. 
This would hard exit here and not show the clearer error on line 42



##########
apache-maven/src/bin/mvn.ps1:
##########
@@ -0,0 +1,158 @@
+<#
+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.
+
+-----------------------------------------------------------------------------
+Apache Maven Startup Script
+
+Environment Variable Prerequisites
+
+  JAVA_HOME       (Optional) Points to a Java installation.
+  MAVEN_ARGS      (Optional) Arguments passed to Maven before CLI arguments.
+  MAVEN_OPTS      (Optional) Java runtime options used when Maven is executed.
+  MAVEN_SKIP_RC   (Optional) Flag to disable loading of mavenrc files.
+-----------------------------------------------------------------------------
+#>
+
+# set title
+$Host.UI.RawUI.WindowTitle = (Get-Variable MyInvocation -Scope 
Script).Value.InvocationName
+
+if (-not $env:MAVEN_SKIP_RC) {
+  if (Test-Path -Path $env:PROGRAMDATA\mavenrc.ps1 -PathType Leaf) { 
&$env:PROGRAMDATA"\mavenrc.ps1" $args }

Review Comment:
   Should, at least for `3.9.x`, it still support the `mavenrc_pre.ps1` and 
`mavenrc_post.ps1` 
[convention](https://maven.apache.org/ref/3.9.4/apache-maven/), as they are 
also still supported (with deprecation warning) in `4.x`. @michael-o 
@slachiewicz ?



##########
apache-maven/src/bin/mvn.ps1:
##########
@@ -0,0 +1,158 @@
+<#
+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.
+
+-----------------------------------------------------------------------------
+Apache Maven Startup Script
+
+Environment Variable Prerequisites
+
+  JAVA_HOME       (Optional) Points to a Java installation.
+  MAVEN_ARGS      (Optional) Arguments passed to Maven before CLI arguments.
+  MAVEN_OPTS      (Optional) Java runtime options used when Maven is executed.
+  MAVEN_SKIP_RC   (Optional) Flag to disable loading of mavenrc files.
+-----------------------------------------------------------------------------
+#>
+
+# set title
+$Host.UI.RawUI.WindowTitle = (Get-Variable MyInvocation -Scope 
Script).Value.InvocationName
+
+if (-not $env:MAVEN_SKIP_RC) {
+  if (Test-Path -Path $env:PROGRAMDATA\mavenrc.ps1 -PathType Leaf) { 
&$env:PROGRAMDATA"\mavenrc.ps1" $args }
+  if (Test-Path -Path $env:USERPROFILE\mavenrc.ps1 -PathType Leaf) { 
&$env:USERPROFILE"\mavenrc.ps1" $args }
+}
+
+if (-not (Test-path $env:JAVA_HOME)) {
+  $JAVACMD = (get-command java).Source 
+  if (-not $JAVACMD) {
+    Write-Error -ErrorAction Stop -Message "The $env:JAVA_HOME has not been 
set, JAVA_HOME environment variable is not defined correctly, so Apache Maven 
cannot be started."
+  }
+}
+else {
+  $JAVACMD = $env:JAVA_HOME + "\bin\java.exe"
+}
+
+if (-not (Test-Path $JAVACMD)) {
+  Write-Error -Message "The JAVA_HOME environment variable is not defined 
correctly, so Apache Maven cannot be started."
+  $ERROR_MESSAGE = "JAVA_HOME is set to " + $env:JAVA_HOME + ", but " + 
$JAVACMD + " does not exist."
+  Write-Error -ErrorAction Stop -Message $ERROR_MESSAGE
+}
+
+# check mvn home
+$MAVEN_HOME = (Get-Item $PSScriptRoot"\..")
+
+# check if maven command exists
+if (-not (Test-path "$MAVEN_HOME\bin\mvn.ps1")) {
+    Write-Error -Message "maven command (\bin\mvn.ps1) cannot be found" 
-ErrorAction Stop
+}
+# ==== END VALIDATION ====
+
+$CLASSWORLDS_CONF = "$MAVEN_HOME\bin\m2.conf"
+
+# Find the project basedir, i.e., the directory that contains the directory 
".mvn".
+# Fallback to current working directory if not found.
+
+$WDIR = Get-Location
+
+# Look for the --file switch and start the search for the .mvn directory from 
the specified
+# POM location, if supplied.
+
+$i = 0
+$file_flag_found = $false
+foreach ($arg in $args) {
+  if (($arg -ceq "-f") -or ($arg -ceq "--file")) {
+    $file_flag_found = $true
+    break
+  }
+  $i += 1
+}
+
+function IsNotRoot {
+  param (
+    [String] $path
+  )
+
+  return -not $path.endsWith(":\")

Review Comment:
   I'm not sure if it can/will be run on a share. _If_ that happens I think 
`:\` is not sufficient, as a share starts with `\\share\some\path`.
   
   I believe `$path` is always a folder in this script, so we could use 
`(Get-Item $path).Root` instead. 
   
   _I've never tried how this behaves on a share though... I would expect it to 
return `\\share\` as it normally returns the drive e.g. `C:\`._



##########
apache-maven/src/bin/mvn.ps1:
##########
@@ -0,0 +1,158 @@
+<#
+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.
+
+-----------------------------------------------------------------------------
+Apache Maven Startup Script
+
+Environment Variable Prerequisites
+
+  JAVA_HOME       (Optional) Points to a Java installation.

Review Comment:
   Small detail, but kind of required. Either `JAVA_HOME` or a `java` command 
has to be present otherwise it throws an error.



##########
apache-maven/src/bin/mvn.ps1:
##########
@@ -0,0 +1,158 @@
+<#
+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.
+
+-----------------------------------------------------------------------------
+Apache Maven Startup Script
+
+Environment Variable Prerequisites
+
+  JAVA_HOME       (Optional) Points to a Java installation.
+  MAVEN_ARGS      (Optional) Arguments passed to Maven before CLI arguments.
+  MAVEN_OPTS      (Optional) Java runtime options used when Maven is executed.
+  MAVEN_SKIP_RC   (Optional) Flag to disable loading of mavenrc files.
+-----------------------------------------------------------------------------
+#>
+
+# set title
+$Host.UI.RawUI.WindowTitle = (Get-Variable MyInvocation -Scope 
Script).Value.InvocationName
+
+if (-not $env:MAVEN_SKIP_RC) {
+  if (Test-Path -Path $env:PROGRAMDATA\mavenrc.ps1 -PathType Leaf) { 
&$env:PROGRAMDATA"\mavenrc.ps1" $args }
+  if (Test-Path -Path $env:USERPROFILE\mavenrc.ps1 -PathType Leaf) { 
&$env:USERPROFILE"\mavenrc.ps1" $args }
+}
+
+if (-not (Test-path $env:JAVA_HOME)) {
+  $JAVACMD = (get-command java).Source 
+  if (-not $JAVACMD) {
+    Write-Error -ErrorAction Stop -Message "The $env:JAVA_HOME has not been 
set, JAVA_HOME environment variable is not defined correctly, so Apache Maven 
cannot be started."
+  }
+}
+else {
+  $JAVACMD = $env:JAVA_HOME + "\bin\java.exe"
+}
+
+if (-not (Test-Path $JAVACMD)) {
+  Write-Error -Message "The JAVA_HOME environment variable is not defined 
correctly, so Apache Maven cannot be started."
+  $ERROR_MESSAGE = "JAVA_HOME is set to " + $env:JAVA_HOME + ", but " + 
$JAVACMD + " does not exist."
+  Write-Error -ErrorAction Stop -Message $ERROR_MESSAGE
+}
+
+# check mvn home
+$MAVEN_HOME = (Get-Item $PSScriptRoot"\..")
+
+# check if maven command exists
+if (-not (Test-path "$MAVEN_HOME\bin\mvn.ps1")) {
+    Write-Error -Message "maven command (\bin\mvn.ps1) cannot be found" 
-ErrorAction Stop
+}
+# ==== END VALIDATION ====
+
+$CLASSWORLDS_CONF = "$MAVEN_HOME\bin\m2.conf"
+
+# Find the project basedir, i.e., the directory that contains the directory 
".mvn".
+# Fallback to current working directory if not found.
+
+$WDIR = Get-Location
+
+# Look for the --file switch and start the search for the .mvn directory from 
the specified
+# POM location, if supplied.
+
+$i = 0
+$file_flag_found = $false
+foreach ($arg in $args) {

Review Comment:
   You could consider using named parameters here.
   
   If we start the script with `param ($file, $f)` we can use auto completion 
from the command line. We could also get rid of the loop and the index `$i`. 
Throughout the script you can just reference `$file` and/or `$f`.
   
   *Do note it will behave a little different on line 156 as the $args does not 
contain the named parameters. Also `mvnDebug.ps1` needs a different invocation.*



##########
apache-maven/src/bin/mvn.ps1:
##########
@@ -0,0 +1,158 @@
+<#
+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.
+
+-----------------------------------------------------------------------------
+Apache Maven Startup Script
+
+Environment Variable Prerequisites
+
+  JAVA_HOME       (Optional) Points to a Java installation.
+  MAVEN_ARGS      (Optional) Arguments passed to Maven before CLI arguments.
+  MAVEN_OPTS      (Optional) Java runtime options used when Maven is executed.
+  MAVEN_SKIP_RC   (Optional) Flag to disable loading of mavenrc files.
+-----------------------------------------------------------------------------
+#>
+
+# set title
+$Host.UI.RawUI.WindowTitle = (Get-Variable MyInvocation -Scope 
Script).Value.InvocationName
+
+if (-not $env:MAVEN_SKIP_RC) {
+  if (Test-Path -Path $env:PROGRAMDATA\mavenrc.ps1 -PathType Leaf) { 
&$env:PROGRAMDATA"\mavenrc.ps1" $args }
+  if (Test-Path -Path $env:USERPROFILE\mavenrc.ps1 -PathType Leaf) { 
&$env:USERPROFILE"\mavenrc.ps1" $args }
+}
+
+if (-not (Test-path $env:JAVA_HOME)) {
+  $JAVACMD = (get-command java).Source 
+  if (-not $JAVACMD) {
+    Write-Error -ErrorAction Stop -Message "The $env:JAVA_HOME has not been 
set, JAVA_HOME environment variable is not defined correctly, so Apache Maven 
cannot be started."
+  }
+}
+else {
+  $JAVACMD = $env:JAVA_HOME + "\bin\java.exe"
+}
+
+if (-not (Test-Path $JAVACMD)) {
+  Write-Error -Message "The JAVA_HOME environment variable is not defined 
correctly, so Apache Maven cannot be started."
+  $ERROR_MESSAGE = "JAVA_HOME is set to " + $env:JAVA_HOME + ", but " + 
$JAVACMD + " does not exist."
+  Write-Error -ErrorAction Stop -Message $ERROR_MESSAGE
+}
+
+# check mvn home
+$MAVEN_HOME = (Get-Item $PSScriptRoot"\..")
+
+# check if maven command exists
+if (-not (Test-path "$MAVEN_HOME\bin\mvn.ps1")) {
+    Write-Error -Message "maven command (\bin\mvn.ps1) cannot be found" 
-ErrorAction Stop
+}
+# ==== END VALIDATION ====
+
+$CLASSWORLDS_CONF = "$MAVEN_HOME\bin\m2.conf"
+
+# Find the project basedir, i.e., the directory that contains the directory 
".mvn".
+# Fallback to current working directory if not found.
+
+$WDIR = Get-Location
+
+# Look for the --file switch and start the search for the .mvn directory from 
the specified
+# POM location, if supplied.
+
+$i = 0
+$file_flag_found = $false
+foreach ($arg in $args) {
+  if (($arg -ceq "-f") -or ($arg -ceq "--file")) {
+    $file_flag_found = $true
+    break
+  }
+  $i += 1
+}
+
+function IsNotRoot {
+  param (
+    [String] $path
+  )
+
+  return -not $path.endsWith(":\")
+}
+
+function RetrieveContentsJvmConfig {
+  param (
+    [String] $path
+  )
+
+  $jvm_location = $path + "\.mvn\jvm.config"
+
+  if (Test-Path $jvm_location) {
+    return $env:MAVEN_OPTS + (Get-Content $jvm_location).Replace("`n", 
"").Replace("`r", "");

Review Comment:
   Is this to replace windows line endings (`\r\n`)? I think this won't work as 
it tries to replace `'n` as literal 2 character combination, never tried it 
though.
   
   I would suggest the following: 
   `Get-Content` is an array of objects. You can simply `-Join (Get-Content 
$filePath)` and it will be put into 1 string as arguments. 
   It might also need to have an additional space in front?



##########
apache-maven/src/bin/mvn.ps1:
##########
@@ -0,0 +1,158 @@
+<#
+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.
+
+-----------------------------------------------------------------------------
+Apache Maven Startup Script
+
+Environment Variable Prerequisites
+
+  JAVA_HOME       (Optional) Points to a Java installation.
+  MAVEN_ARGS      (Optional) Arguments passed to Maven before CLI arguments.
+  MAVEN_OPTS      (Optional) Java runtime options used when Maven is executed.
+  MAVEN_SKIP_RC   (Optional) Flag to disable loading of mavenrc files.
+-----------------------------------------------------------------------------
+#>
+
+# set title
+$Host.UI.RawUI.WindowTitle = (Get-Variable MyInvocation -Scope 
Script).Value.InvocationName
+
+if (-not $env:MAVEN_SKIP_RC) {
+  if (Test-Path -Path $env:PROGRAMDATA\mavenrc.ps1 -PathType Leaf) { 
&$env:PROGRAMDATA"\mavenrc.ps1" $args }
+  if (Test-Path -Path $env:USERPROFILE\mavenrc.ps1 -PathType Leaf) { 
&$env:USERPROFILE"\mavenrc.ps1" $args }
+}
+
+if (-not (Test-path $env:JAVA_HOME)) {
+  $JAVACMD = (get-command java).Source 
+  if (-not $JAVACMD) {
+    Write-Error -ErrorAction Stop -Message "The $env:JAVA_HOME has not been 
set, JAVA_HOME environment variable is not defined correctly, so Apache Maven 
cannot be started."

Review Comment:
   I personally prefer to use `Throw`  over `Write-Error -ErrorAction Stop` as 
it will result in a more clouded `$Error` object.
   
   
![image](https://github.com/apache/maven/assets/27761321/7b069a86-b146-451a-899a-9e7a058110a1)
   



##########
apache-maven/src/bin/mvn.ps1:
##########
@@ -0,0 +1,158 @@
+<#
+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.
+
+-----------------------------------------------------------------------------
+Apache Maven Startup Script
+
+Environment Variable Prerequisites
+
+  JAVA_HOME       (Optional) Points to a Java installation.
+  MAVEN_ARGS      (Optional) Arguments passed to Maven before CLI arguments.
+  MAVEN_OPTS      (Optional) Java runtime options used when Maven is executed.
+  MAVEN_SKIP_RC   (Optional) Flag to disable loading of mavenrc files.
+-----------------------------------------------------------------------------
+#>
+
+# set title
+$Host.UI.RawUI.WindowTitle = (Get-Variable MyInvocation -Scope 
Script).Value.InvocationName
+
+if (-not $env:MAVEN_SKIP_RC) {
+  if (Test-Path -Path $env:PROGRAMDATA\mavenrc.ps1 -PathType Leaf) { 
&$env:PROGRAMDATA"\mavenrc.ps1" $args }
+  if (Test-Path -Path $env:USERPROFILE\mavenrc.ps1 -PathType Leaf) { 
&$env:USERPROFILE"\mavenrc.ps1" $args }
+}
+
+if (-not (Test-path $env:JAVA_HOME)) {
+  $JAVACMD = (get-command java).Source 
+  if (-not $JAVACMD) {
+    Write-Error -ErrorAction Stop -Message "The $env:JAVA_HOME has not been 
set, JAVA_HOME environment variable is not defined correctly, so Apache Maven 
cannot be started."
+  }
+}
+else {
+  $JAVACMD = $env:JAVA_HOME + "\bin\java.exe"
+}
+
+if (-not (Test-Path $JAVACMD)) {
+  Write-Error -Message "The JAVA_HOME environment variable is not defined 
correctly, so Apache Maven cannot be started."
+  $ERROR_MESSAGE = "JAVA_HOME is set to " + $env:JAVA_HOME + ", but " + 
$JAVACMD + " does not exist."
+  Write-Error -ErrorAction Stop -Message $ERROR_MESSAGE
+}
+
+# check mvn home
+$MAVEN_HOME = (Get-Item $PSScriptRoot"\..")
+
+# check if maven command exists
+if (-not (Test-path "$MAVEN_HOME\bin\mvn.ps1")) {
+    Write-Error -Message "maven command (\bin\mvn.ps1) cannot be found" 
-ErrorAction Stop
+}
+# ==== END VALIDATION ====
+
+$CLASSWORLDS_CONF = "$MAVEN_HOME\bin\m2.conf"
+
+# Find the project basedir, i.e., the directory that contains the directory 
".mvn".
+# Fallback to current working directory if not found.
+
+$WDIR = Get-Location
+
+# Look for the --file switch and start the search for the .mvn directory from 
the specified
+# POM location, if supplied.
+
+$i = 0
+$file_flag_found = $false
+foreach ($arg in $args) {
+  if (($arg -ceq "-f") -or ($arg -ceq "--file")) {
+    $file_flag_found = $true
+    break
+  }
+  $i += 1
+}
+
+function IsNotRoot {
+  param (
+    [String] $path
+  )
+
+  return -not $path.endsWith(":\")
+}
+
+function RetrieveContentsJvmConfig {
+  param (
+    [String] $path
+  )
+
+  $jvm_location = $path + "\.mvn\jvm.config"
+
+  if (Test-Path $jvm_location) {
+    return $env:MAVEN_OPTS + (Get-Content $jvm_location).Replace("`n", 
"").Replace("`r", "");
+  }
+  return $env:MAVEN_OPTS;
+}
+
+$basedir = ""
+
+if ($file_flag_found) {
+  # we need to assess if the file exists
+  # and then search for the maven project base dir. 
+  $pom_file_reference = $args[$i + 1]
+
+  if (Test-Path $pom_file_reference) {
+    $basedir = (Get-Item $pom_file_reference).DirectoryName
+  }
+  else {
+    $pom_file_error = "POM file " + $pom_file_reference + " specified the 
-f/--file command-line argument does not exist"
+    Write-Error -Message $pom_file_error -ErrorAction Stop
+  }
+}
+else {
+  # if file flag is not found, then the pom.xml is relative to the working dir 
+  # and the jvm.config can be found in the maven project base dir. 
+
+  $basedir = $WDIR
+
+  while (IsNotRoot($WDIR.Path)) {

Review Comment:
   If we do not find `.mvn` directory it will use the root directory as 
`$basedir` and as `-Dmaven.multiModuleProjectDirectory`?
   
   I'm not entirely sure what the 
[`.cmd`](https://github.com/apache/maven/blob/0c8b7dfc605ce906f6c73db0aeab1735759da890/apache-maven/src/bin/mvn.cmd#L153)
 does though, I'm not as familiar with `.cmd`. 



##########
apache-maven/src/bin/mvnDebug.ps1:
##########
@@ -0,0 +1,42 @@
+<#
+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.
+
+-----------------------------------------------------------------------------
+Apache Maven Debug Script
+
+Environment Variable Prerequisites
+
+JAVA_HOME           (Optional) Points to a Java installation.
+MAVEN_OPTS          (Optional) Java runtime options used when Maven is 
executed.
+MAVEN_SKIP_RC       (Optional) Flag to disable loading of mavenrc files.
+MAVEN_DEBUG_ADDRESS (Optional) Set the debug address. Default value is 
localhost:8000
+-----------------------------------------------------------------------------
+#>
+
+# set title
+$Host.UI.RawUI.WindowTitle = $MyInvocation.MyCommand
+
+if (-not $env:MAVEN_DEBUG_ADDRESS ) {
+    $env:MAVEN_DEBUG_ADDRESS = "localhost:8000"
+}
+
+$env:MAVEN_DEBUG_OPTS = "-Xdebug 
-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=$env:MAVEN_DEBUG_ADDRESS"

Review Comment:
   I'm not as familiar with `.cmd` files, but I believe the 
[current](https://github.com/apache/maven/blob/maven-3.9.x/apache-maven/src/bin/mvnDebug.cmd)
 `.cmd` just makes it port `8000` (no `localhost`).



##########
apache-maven/src/bin/mvn.ps1:
##########
@@ -0,0 +1,158 @@
+<#
+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.
+
+-----------------------------------------------------------------------------
+Apache Maven Startup Script
+
+Environment Variable Prerequisites
+
+  JAVA_HOME       (Optional) Points to a Java installation.
+  MAVEN_ARGS      (Optional) Arguments passed to Maven before CLI arguments.
+  MAVEN_OPTS      (Optional) Java runtime options used when Maven is executed.
+  MAVEN_SKIP_RC   (Optional) Flag to disable loading of mavenrc files.
+-----------------------------------------------------------------------------
+#>
+
+# set title
+$Host.UI.RawUI.WindowTitle = (Get-Variable MyInvocation -Scope 
Script).Value.InvocationName
+
+if (-not $env:MAVEN_SKIP_RC) {
+  if (Test-Path -Path $env:PROGRAMDATA\mavenrc.ps1 -PathType Leaf) { 
&$env:PROGRAMDATA"\mavenrc.ps1" $args }
+  if (Test-Path -Path $env:USERPROFILE\mavenrc.ps1 -PathType Leaf) { 
&$env:USERPROFILE"\mavenrc.ps1" $args }
+}
+
+if (-not (Test-path $env:JAVA_HOME)) {
+  $JAVACMD = (get-command java).Source 
+  if (-not $JAVACMD) {
+    Write-Error -ErrorAction Stop -Message "The $env:JAVA_HOME has not been 
set, JAVA_HOME environment variable is not defined correctly, so Apache Maven 
cannot be started."
+  }
+}
+else {
+  $JAVACMD = $env:JAVA_HOME + "\bin\java.exe"
+}
+
+if (-not (Test-Path $JAVACMD)) {
+  Write-Error -Message "The JAVA_HOME environment variable is not defined 
correctly, so Apache Maven cannot be started."
+  $ERROR_MESSAGE = "JAVA_HOME is set to " + $env:JAVA_HOME + ", but " + 
$JAVACMD + " does not exist."
+  Write-Error -ErrorAction Stop -Message $ERROR_MESSAGE
+}
+
+# check mvn home
+$MAVEN_HOME = (Get-Item $PSScriptRoot"\..")
+
+# check if maven command exists
+if (-not (Test-path "$MAVEN_HOME\bin\mvn.ps1")) {
+    Write-Error -Message "maven command (\bin\mvn.ps1) cannot be found" 
-ErrorAction Stop
+}
+# ==== END VALIDATION ====
+
+$CLASSWORLDS_CONF = "$MAVEN_HOME\bin\m2.conf"
+
+# Find the project basedir, i.e., the directory that contains the directory 
".mvn".
+# Fallback to current working directory if not found.
+
+$WDIR = Get-Location
+
+# Look for the --file switch and start the search for the .mvn directory from 
the specified
+# POM location, if supplied.
+
+$i = 0
+$file_flag_found = $false
+foreach ($arg in $args) {
+  if (($arg -ceq "-f") -or ($arg -ceq "--file")) {
+    $file_flag_found = $true
+    break
+  }
+  $i += 1
+}
+
+function IsNotRoot {
+  param (
+    [String] $path
+  )
+
+  return -not $path.endsWith(":\")
+}
+
+function RetrieveContentsJvmConfig {
+  param (
+    [String] $path
+  )
+
+  $jvm_location = $path + "\.mvn\jvm.config"
+
+  if (Test-Path $jvm_location) {
+    return $env:MAVEN_OPTS + (Get-Content $jvm_location).Replace("`n", 
"").Replace("`r", "");
+  }
+  return $env:MAVEN_OPTS;
+}
+
+$basedir = ""
+
+if ($file_flag_found) {
+  # we need to assess if the file exists
+  # and then search for the maven project base dir. 
+  $pom_file_reference = $args[$i + 1]
+
+  if (Test-Path $pom_file_reference) {
+    $basedir = (Get-Item $pom_file_reference).DirectoryName
+  }
+  else {
+    $pom_file_error = "POM file " + $pom_file_reference + " specified the 
-f/--file command-line argument does not exist"
+    Write-Error -Message $pom_file_error -ErrorAction Stop
+  }
+}
+else {
+  # if file flag is not found, then the pom.xml is relative to the working dir 
+  # and the jvm.config can be found in the maven project base dir. 
+
+  $basedir = $WDIR
+
+  while (IsNotRoot($WDIR.Path)) {
+    if (Test-Path "$WDIR\.mvn") {
+      $basedir = $WDIR
+      break
+    }
+
+    if ($WDIR) {
+      $WDIR = Split-Path $WDIR      
+    }
+    else {
+      break
+    }  
+  }
+}
+
+$MAVEN_OPTS = (RetrieveContentsJvmConfig $basedir)
+
+$LAUNCHER_JAR = Get-Item $MAVEN_HOME"\boot\plexus-classworlds*.jar"

Review Comment:
   If there are multiple jars (as the `*` suggests), I think this will fail as 
the separator would be a space.
   (Note the 
[`.cmd`](https://github.com/apache/maven/blob/0c8b7dfc605ce906f6c73db0aeab1735759da890/apache-maven/src/bin/mvn.cmd#L169C1-L170C1)
 has an extra `-` and does not filter on `.jar`)



##########
apache-maven/src/bin/mvn.ps1:
##########
@@ -0,0 +1,158 @@
+<#
+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.
+
+-----------------------------------------------------------------------------
+Apache Maven Startup Script
+
+Environment Variable Prerequisites
+
+  JAVA_HOME       (Optional) Points to a Java installation.
+  MAVEN_ARGS      (Optional) Arguments passed to Maven before CLI arguments.
+  MAVEN_OPTS      (Optional) Java runtime options used when Maven is executed.
+  MAVEN_SKIP_RC   (Optional) Flag to disable loading of mavenrc files.
+-----------------------------------------------------------------------------
+#>
+
+# set title
+$Host.UI.RawUI.WindowTitle = (Get-Variable MyInvocation -Scope 
Script).Value.InvocationName
+
+if (-not $env:MAVEN_SKIP_RC) {
+  if (Test-Path -Path $env:PROGRAMDATA\mavenrc.ps1 -PathType Leaf) { 
&$env:PROGRAMDATA"\mavenrc.ps1" $args }
+  if (Test-Path -Path $env:USERPROFILE\mavenrc.ps1 -PathType Leaf) { 
&$env:USERPROFILE"\mavenrc.ps1" $args }
+}
+
+if (-not (Test-path $env:JAVA_HOME)) {
+  $JAVACMD = (get-command java).Source 
+  if (-not $JAVACMD) {
+    Write-Error -ErrorAction Stop -Message "The $env:JAVA_HOME has not been 
set, JAVA_HOME environment variable is not defined correctly, so Apache Maven 
cannot be started."
+  }
+}
+else {
+  $JAVACMD = $env:JAVA_HOME + "\bin\java.exe"
+}
+
+if (-not (Test-Path $JAVACMD)) {
+  Write-Error -Message "The JAVA_HOME environment variable is not defined 
correctly, so Apache Maven cannot be started."
+  $ERROR_MESSAGE = "JAVA_HOME is set to " + $env:JAVA_HOME + ", but " + 
$JAVACMD + " does not exist."
+  Write-Error -ErrorAction Stop -Message $ERROR_MESSAGE
+}
+
+# check mvn home
+$MAVEN_HOME = (Get-Item $PSScriptRoot"\..")

Review Comment:
   You could consider using `Join-Path` so that we don't have to worry about 
manually inserting `/` or `\` and the direction they are pointing. To go up a 
directory you could use `(Get-Item $path).Parent` (only works on directories).





> Native support for PowerShell to start Maven
> --------------------------------------------
>
>                 Key: MNG-7541
>                 URL: https://issues.apache.org/jira/browse/MNG-7541
>             Project: Maven
>          Issue Type: Improvement
>          Components: Command Line
>    Affects Versions: 3.8.3
>         Environment: windows 10 / 11
>            Reporter: Jurrian Fahner
>            Priority: Trivial
>              Labels: Script, Windows10, Windows11
>
> Maven has two files in the bin dir:
> ||command||its use||
> |mvn|POSIX shell|
> |mvn.cmd|cmd.exe|
> On windows there are two ways to write scripts, by using cmd.exe or using 
> powershell.
> If you enter mvn in powershell it will look for `mvn.ps1` on the PATH first. 
> If it doesn't find anything it will execute `mvn.cmd` as fall-back.
> When running maven for starting a server for development purposes and you do 
> ctrl-c to exit the server it will ask the question: Terminate batch job (Y/N)?
> As far as I know it is default behaviour of cmd.exe.
> Well if I don't want to terminate, I wouldn't press ctrl-c. ;)
> It is not the case (as far as I know that Microsoft is going to deprecate 
> cmd.exe in favor of powershell: 
> [https://devblogs.microsoft.com/commandline/rumors-of-cmds-death-have-been-greatly-exaggerated/]
> Allthough I think it would be a good move for maven to have also a powershell 
> script as well... It is possible to integrate elegant support for native help 
> in powershell, `get-help mvn`.
> But it also increases the maintenance effort as well. I don't know whether 
> this cost outweigh the benefits, though...
> By the way I would happy to contribute if it is appreciated.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to