mvnw.cmd
  1  <# : batch portion
  2  @REM ----------------------------------------------------------------------------
  3  @REM Licensed to the Apache Software Foundation (ASF) under one
  4  @REM or more contributor license agreements.  See the NOTICE file
  5  @REM distributed with this work for additional information
  6  @REM regarding copyright ownership.  The ASF licenses this file
  7  @REM to you under the Apache License, Version 2.0 (the
  8  @REM "License"); you may not use this file except in compliance
  9  @REM with the License.  You may obtain a copy of the License at
 10  @REM
 11  @REM    http://www.apache.org/licenses/LICENSE-2.0
 12  @REM
 13  @REM Unless required by applicable law or agreed to in writing,
 14  @REM software distributed under the License is distributed on an
 15  @REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 16  @REM KIND, either express or implied.  See the License for the
 17  @REM specific language governing permissions and limitations
 18  @REM under the License.
 19  @REM ----------------------------------------------------------------------------
 20  
 21  @REM ----------------------------------------------------------------------------
 22  @REM Apache Maven Wrapper startup batch script, version 3.3.4
 23  @REM
 24  @REM Optional ENV vars
 25  @REM   MVNW_REPOURL - repo url base for downloading maven distribution
 26  @REM   MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven
 27  @REM   MVNW_VERBOSE - true: enable verbose log; others: silence the output
 28  @REM ----------------------------------------------------------------------------
 29  
 30  @IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0)
 31  @SET __MVNW_CMD__=
 32  @SET __MVNW_ERROR__=
 33  @SET __MVNW_PSMODULEP_SAVE=%PSModulePath%
 34  @SET PSModulePath=
 35  @FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @(
 36    IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B)
 37  )
 38  @SET PSModulePath=%__MVNW_PSMODULEP_SAVE%
 39  @SET __MVNW_PSMODULEP_SAVE=
 40  @SET __MVNW_ARG0_NAME__=
 41  @SET MVNW_USERNAME=
 42  @SET MVNW_PASSWORD=
 43  @IF NOT "%__MVNW_CMD__%"=="" ("%__MVNW_CMD__%" %*)
 44  @echo Cannot start maven from wrapper >&2 && exit /b 1
 45  @GOTO :EOF
 46  : end batch / begin powershell #>
 47  
 48  $ErrorActionPreference = "Stop"
 49  if ($env:MVNW_VERBOSE -eq "true") {
 50    $VerbosePreference = "Continue"
 51  }
 52  
 53  # calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties
 54  $distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl
 55  if (!$distributionUrl) {
 56    Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties"
 57  }
 58  
 59  switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) {
 60    "maven-mvnd-*" {
 61      $USE_MVND = $true
 62      $distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip"
 63      $MVN_CMD = "mvnd.cmd"
 64      break
 65    }
 66    default {
 67      $USE_MVND = $false
 68      $MVN_CMD = $script -replace '^mvnw','mvn'
 69      break
 70    }
 71  }
 72  
 73  # apply MVNW_REPOURL and calculate MAVEN_HOME
 74  # maven home pattern: ~/.m2/wrapper/dists/{apache-maven-<version>,maven-mvnd-<version>-<platform>}/<hash>
 75  if ($env:MVNW_REPOURL) {
 76    $MVNW_REPO_PATTERN = if ($USE_MVND -eq $False) { "/org/apache/maven/" } else { "/maven/mvnd/" }
 77    $distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace "^.*$MVNW_REPO_PATTERN",'')"
 78  }
 79  $distributionUrlName = $distributionUrl -replace '^.*/',''
 80  $distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$',''
 81  
 82  $MAVEN_M2_PATH = "$HOME/.m2"
 83  if ($env:MAVEN_USER_HOME) {
 84    $MAVEN_M2_PATH = "$env:MAVEN_USER_HOME"
 85  }
 86  
 87  if (-not (Test-Path -Path $MAVEN_M2_PATH)) {
 88      New-Item -Path $MAVEN_M2_PATH -ItemType Directory | Out-Null
 89  }
 90  
 91  $MAVEN_WRAPPER_DISTS = $null
 92  if ((Get-Item $MAVEN_M2_PATH).Target[0] -eq $null) {
 93    $MAVEN_WRAPPER_DISTS = "$MAVEN_M2_PATH/wrapper/dists"
 94  } else {
 95    $MAVEN_WRAPPER_DISTS = (Get-Item $MAVEN_M2_PATH).Target[0] + "/wrapper/dists"
 96  }
 97  
 98  $MAVEN_HOME_PARENT = "$MAVEN_WRAPPER_DISTS/$distributionUrlNameMain"
 99  $MAVEN_HOME_NAME = ([System.Security.Cryptography.SHA256]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join ''
100  $MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME"
101  
102  if (Test-Path -Path "$MAVEN_HOME" -PathType Container) {
103    Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME"
104    Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD"
105    exit $?
106  }
107  
108  if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) {
109    Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl"
110  }
111  
112  # prepare tmp dir
113  $TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile
114  $TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir"
115  $TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null
116  trap {
117    if ($TMP_DOWNLOAD_DIR.Exists) {
118      try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null }
119      catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" }
120    }
121  }
122  
123  New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null
124  
125  # Download and Install Apache Maven
126  Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..."
127  Write-Verbose "Downloading from: $distributionUrl"
128  Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName"
129  
130  $webclient = New-Object System.Net.WebClient
131  if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) {
132    $webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD)
133  }
134  [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
135  $webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null
136  
137  # If specified, validate the SHA-256 sum of the Maven distribution zip file
138  $distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum
139  if ($distributionSha256Sum) {
140    if ($USE_MVND) {
141      Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties."
142    }
143    Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash
144    if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) {
145      Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property."
146    }
147  }
148  
149  # unzip and move
150  Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null
151  
152  # Find the actual extracted directory name (handles snapshots where filename != directory name)
153  $actualDistributionDir = ""
154  
155  # First try the expected directory name (for regular distributions)
156  $expectedPath = Join-Path "$TMP_DOWNLOAD_DIR" "$distributionUrlNameMain"
157  $expectedMvnPath = Join-Path "$expectedPath" "bin/$MVN_CMD"
158  if ((Test-Path -Path $expectedPath -PathType Container) -and (Test-Path -Path $expectedMvnPath -PathType Leaf)) {
159    $actualDistributionDir = $distributionUrlNameMain
160  }
161  
162  # If not found, search for any directory with the Maven executable (for snapshots)
163  if (!$actualDistributionDir) {
164    Get-ChildItem -Path "$TMP_DOWNLOAD_DIR" -Directory | ForEach-Object {
165      $testPath = Join-Path $_.FullName "bin/$MVN_CMD"
166      if (Test-Path -Path $testPath -PathType Leaf) {
167        $actualDistributionDir = $_.Name
168      }
169    }
170  }
171  
172  if (!$actualDistributionDir) {
173    Write-Error "Could not find Maven distribution directory in extracted archive"
174  }
175  
176  Write-Verbose "Found extracted Maven distribution directory: $actualDistributionDir"
177  Rename-Item -Path "$TMP_DOWNLOAD_DIR/$actualDistributionDir" -NewName $MAVEN_HOME_NAME | Out-Null
178  try {
179    Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null
180  } catch {
181    if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) {
182      Write-Error "fail to move MAVEN_HOME"
183    }
184  } finally {
185    try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null }
186    catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" }
187  }
188  
189  Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD"