Skip to content

Commit 908d2a0

Browse files
Add Maven Wrapper for controlled Maven version builds (#1455)
* Add Maven Wrapper for consistent build environment * Update to Maven 3.9.12 and wrapper 3.3.4
1 parent dd4e981 commit 908d2a0

File tree

4 files changed

+539
-6
lines changed

4 files changed

+539
-6
lines changed
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# Licensed to the Apache Software Foundation (ASF) under one
2+
# or more contributor license agreements. See the NOTICE file
3+
# distributed with this work for additional information
4+
# regarding copyright ownership. The ASF licenses this file
5+
# to you under the Apache License, Version 2.0 (the
6+
# "License"); you may not use this file except in compliance
7+
# with the License. You may obtain a copy of the License at
8+
#
9+
# http://www.apache.org/licenses/LICENSE-2.0
10+
#
11+
# Unless required by applicable law or agreed to in writing,
12+
# software distributed under the License is distributed on an
13+
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14+
# KIND, either express or implied. See the License for the
15+
# specific language governing permissions and limitations
16+
# under the License.
17+
wrapperVersion=3.3.4
18+
distributionType=bin
19+
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.12/apache-maven-3.9.12-bin.zip
20+
wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.3.4/maven-wrapper-3.3.4.jar

README.md

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -401,11 +401,11 @@ build errors due to incompatible versions of `Node.js` tooling installed on your
401401

402402
### Preparing Maven
403403

404-
Make sure that you have Maven installed.
404+
This project includes Maven Wrapper, so you don't need to install Maven manually. Just use `./mvnw` (or `mvnw.cmd` on Windows) instead of `mvn`. The wrapper automatically downloads the correct Maven version (3.9.6) on first run.
405405

406-
$ mvn --version
406+
If you prefer using your own Maven installation:
407407

408-
If this command fails with an error, you do not have Maven installed.
408+
$ mvn --version
409409

410410
Please install Maven using your favorite package manager (like [Homebrew](https://brew.sh/)) or from
411411
official [Maven binaries](https://maven.apache.org/install.html)
@@ -423,7 +423,11 @@ When building everything from scratch the build executes following steps:
423423

424424
You can do all of this with one single command:
425425

426-
$ mvn package
426+
$ ./mvnw package
427+
428+
Or on Windows:
429+
430+
> mvnw.cmd package
427431

428432
The whole process takes up to five minutes (time to grab some coffee!)
429433

@@ -434,7 +438,7 @@ When the build is finished you should see the generated website in the `public`
434438
When rebuilding the website you can optimize the build process as some of the steps are only required for a fresh
435439
build from scratch. You can skip the ui theme rendering (unless you have changes in the theme itself).
436440

437-
$ mvn package -Dskip.theme
441+
$ ./mvnw package -Dskip.theme
438442

439443
This should save you some minutes in the build process. You can find the updated website content in the `public` directory.
440444

@@ -445,7 +449,7 @@ When rebuilding the website the process uses some cached content (e.g. the fetch
445449
If you want to start from scratch for some reason you can simply add the `clean` operation to the build which removes
446450
all generated sources in the project first.
447451

448-
$ mvn clean package
452+
$ ./mvnw clean package
449453

450454
Of course this then takes some more time than an optimized rebuild (time to grab another coffee!).
451455

mvnw

Lines changed: 304 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,304 @@
1+
#!/bin/sh
2+
# ----------------------------------------------------------------------------
3+
# Licensed to the Apache Software Foundation (ASF) under one
4+
# or more contributor license agreements. See the NOTICE file
5+
# distributed with this work for additional information
6+
# regarding copyright ownership. The ASF licenses this file
7+
# to you under the Apache License, Version 2.0 (the
8+
# "License"); you may not use this file except in compliance
9+
# with the License. You may obtain a copy of the License at
10+
#
11+
# http://www.apache.org/licenses/LICENSE-2.0
12+
#
13+
# Unless required by applicable law or agreed to in writing,
14+
# software distributed under the License is distributed on an
15+
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16+
# KIND, either express or implied. See the License for the
17+
# specific language governing permissions and limitations
18+
# under the License.
19+
# ----------------------------------------------------------------------------
20+
21+
# ----------------------------------------------------------------------------
22+
# Apache Maven Wrapper startup batch script, version 3.3.4
23+
#
24+
# Required ENV vars:
25+
# ------------------
26+
# JAVA_HOME - location of a JDK home dir
27+
#
28+
# Optional ENV vars
29+
# -----------------
30+
# MAVEN_OPTS - parameters passed to the Java VM when running Maven
31+
# e.g. to debug Maven itself, use
32+
# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
33+
# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
34+
# ----------------------------------------------------------------------------
35+
36+
if [ -z "$MAVEN_SKIP_RC" ] ; then
37+
38+
if [ -f /usr/local/etc/mavenrc ] ; then
39+
. /usr/local/etc/mavenrc
40+
fi
41+
42+
if [ -f /etc/mavenrc ] ; then
43+
. /etc/mavenrc
44+
fi
45+
46+
if [ -f "$HOME/.mavenrc" ] ; then
47+
. "$HOME/.mavenrc"
48+
fi
49+
50+
fi
51+
52+
# OS specific support. $var _must_ be set to either true or false.
53+
cygwin=false;
54+
darwin=false;
55+
mingw=false
56+
case "$(uname)" in
57+
CYGWIN*) cygwin=true ;;
58+
MINGW*) mingw=true;;
59+
Darwin*) darwin=true
60+
# Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
61+
# See https://developer.apple.com/library/mac/qa/qa1170/_index.html
62+
if [ -z "$JAVA_HOME" ]; then
63+
if [ -x "/usr/libexec/java_home" ]; then
64+
JAVA_HOME="$(/usr/libexec/java_home)"; export JAVA_HOME
65+
else
66+
JAVA_HOME="/Library/Java/Home"; export JAVA_HOME
67+
fi
68+
fi
69+
;;
70+
esac
71+
72+
if [ -z "$JAVA_HOME" ] ; then
73+
if [ -r /etc/gentoo-release ] ; then
74+
JAVA_HOME=$(java-config --jre-home)
75+
fi
76+
fi
77+
78+
# For Cygwin, ensure paths are in UNIX format before anything is touched
79+
if $cygwin ; then
80+
[ -n "$JAVA_HOME" ] &&
81+
JAVA_HOME=$(cygpath --unix "$JAVA_HOME")
82+
[ -n "$CLASSPATH" ] &&
83+
CLASSPATH=$(cygpath --path --unix "$CLASSPATH")
84+
fi
85+
86+
# For Mingw, ensure paths are in UNIX format before anything is touched
87+
if $mingw ; then
88+
[ -n "$JAVA_HOME" ] && [ -d "$JAVA_HOME" ] &&
89+
JAVA_HOME="$(cd "$JAVA_HOME" || (echo "cannot cd into $JAVA_HOME."; exit 1); pwd)"
90+
fi
91+
92+
if [ -z "$JAVA_HOME" ]; then
93+
javaExecutable="$(which javac)"
94+
if [ -n "$javaExecutable" ] && ! [ "$(expr "\"$javaExecutable\"" : '\([^ ]*\)')" = "no" ]; then
95+
# readlink(1) is not available as standard on Solaris 10.
96+
readLink=$(which readlink)
97+
if [ ! "$(expr "$readLink" : '\([^ ]*\)')" = "no" ]; then
98+
if $darwin ; then
99+
javaHome="$(dirname "\"$javaExecutable\"")"
100+
javaExecutable="$(cd "\"$javaHome\"" && pwd -P)/javac"
101+
else
102+
javaExecutable="$(readlink -f "\"$javaExecutable\"")"
103+
fi
104+
javaHome="$(dirname "\"$javaExecutable\"")"
105+
javaHome=$(expr "$javaHome" : '\(.*\)/bin')
106+
JAVA_HOME="$javaHome"
107+
export JAVA_HOME
108+
fi
109+
fi
110+
fi
111+
112+
if [ -z "$JAVACMD" ] ; then
113+
if [ -n "$JAVA_HOME" ] ; then
114+
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
115+
# IBM's JDK on AIX uses strange locations for the executables
116+
JAVACMD="$JAVA_HOME/jre/sh/java"
117+
else
118+
JAVACMD="$JAVA_HOME/bin/java"
119+
fi
120+
else
121+
JAVACMD="$(\unset -f command 2>/dev/null; \command -v java)"
122+
fi
123+
fi
124+
125+
if [ ! -x "$JAVACMD" ] ; then
126+
echo "Error: JAVA_HOME is not defined correctly." >&2
127+
echo " We cannot execute $JAVACMD" >&2
128+
exit 1
129+
fi
130+
131+
if [ -z "$JAVA_HOME" ] ; then
132+
echo "Warning: JAVA_HOME environment variable is not set."
133+
fi
134+
135+
# traverses directory structure from process work directory to filesystem root
136+
# first directory with .mvn subdirectory is considered project base directory
137+
find_maven_basedir() {
138+
if [ -z "$1" ]
139+
then
140+
echo "Path not specified to find_maven_basedir"
141+
return 1
142+
fi
143+
144+
basedir="$1"
145+
wdir="$1"
146+
while [ "$wdir" != '/' ] ; do
147+
if [ -d "$wdir"/.mvn ] ; then
148+
basedir=$wdir
149+
break
150+
fi
151+
# workaround for JBEAP-8937 (on Solaris 10/Sparc)
152+
if [ -d "${wdir}" ]; then
153+
wdir=$(cd "$wdir/.." || exit 1; pwd)
154+
fi
155+
# end of workaround
156+
done
157+
printf '%s' "$(cd "$basedir" || exit 1; pwd)"
158+
}
159+
160+
# concatenates all lines of a file
161+
concat_lines() {
162+
if [ -f "$1" ]; then
163+
# Remove \r in case we run on Windows within Git Bash
164+
# and have configured core.autocrlf=true
165+
tr -s '\r\n' ' ' < "$1"
166+
fi
167+
}
168+
169+
log() {
170+
if [ "$MVNW_VERBOSE" = true ]; then
171+
printf '%s\n' "$1"
172+
fi
173+
}
174+
175+
BASE_DIR=$(find_maven_basedir "$(dirname "$0")")
176+
if [ -z "$BASE_DIR" ]; then
177+
exit 1;
178+
fi
179+
180+
MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR
181+
log "$MAVEN_PROJECTBASEDIR"
182+
183+
##########################################################################################
184+
# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
185+
# This allows using the maven wrapper in projects that prohibit checking in binary data.
186+
##########################################################################################
187+
wrapperJarPath="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar"
188+
if [ -r "$wrapperJarPath" ]; then
189+
log "Found $wrapperJarPath"
190+
else
191+
log "Couldn't find $wrapperJarPath, downloading it ..."
192+
193+
if [ -n "$MVNW_REPOURL" ]; then
194+
wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.3.4/maven-wrapper-3.3.4.jar"
195+
else
196+
wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.3.4/maven-wrapper-3.3.4.jar"
197+
fi
198+
while IFS="=" read -r key value; do
199+
# Remove '\r' from value to allow usage on Windows as IFS does not determine newline characters
200+
safeValue=$(echo "$value" | tr -d '\r')
201+
case "$key" in (wrapperUrl) wrapperUrl="$safeValue"; break ;;
202+
esac
203+
done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties"
204+
log "Downloading from: $wrapperUrl"
205+
206+
if $cygwin; then
207+
wrapperJarPath=$(cygpath --path --windows "$wrapperJarPath")
208+
fi
209+
210+
if command -v wget > /dev/null; then
211+
log "Found wget ... using wget"
212+
[ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--quiet"
213+
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
214+
wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
215+
else
216+
wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
217+
fi
218+
elif command -v curl > /dev/null; then
219+
log "Found curl ... using curl"
220+
[ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--silent"
221+
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
222+
curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath"
223+
else
224+
curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath"
225+
fi
226+
else
227+
log "Falling back to using Java to download"
228+
javaSource="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.java"
229+
javaClass="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.class"
230+
# For Cygwin, switch paths to Windows format before running javac
231+
if $cygwin; then
232+
javaSource=$(cygpath --path --windows "$javaSource")
233+
javaClass=$(cygpath --path --windows "$javaClass")
234+
fi
235+
if [ -e "$javaSource" ]; then
236+
if [ ! -e "$javaClass" ]; then
237+
log " - Compiling MavenWrapperDownloader.java ..."
238+
("$JAVA_HOME/bin/javac" "$javaSource")
239+
fi
240+
if [ -e "$javaClass" ]; then
241+
log " - Running MavenWrapperDownloader.java ..."
242+
("$JAVA_HOME/bin/java" -cp "$MAVEN_PROJECTBASEDIR/.mvn/wrapper" MavenWrapperDownloader "$wrapperUrl" "$wrapperJarPath") || rm -f "$wrapperJarPath"
243+
fi
244+
fi
245+
fi
246+
fi
247+
##########################################################################################
248+
# End of extension
249+
##########################################################################################
250+
251+
# If specified, validate the SHA-256 sum of the Maven distribution zip file
252+
distributionSha256Sum=""
253+
while IFS="=" read -r key value; do
254+
case "$key" in (distributionSha256Sum) distributionSha256Sum=$value; break ;;
255+
esac
256+
done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties"
257+
if [ -n "$distributionSha256Sum" ]; then
258+
distributionSha256Result=false
259+
if command -v sha256sum > /dev/null; then
260+
if echo "$distributionSha256Sum -" | sha256sum -c > /dev/null 2>&1; then
261+
distributionSha256Result=true
262+
fi
263+
elif command -v shasum > /dev/null; then
264+
if echo "$distributionSha256Sum -" | shasum -a 256 -c > /dev/null 2>&1; then
265+
distributionSha256Result=true
266+
fi
267+
else
268+
echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2
269+
echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2
270+
exit 1
271+
fi
272+
if [ $distributionSha256Result = false ]; then
273+
echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2
274+
echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2
275+
exit 1
276+
fi
277+
fi
278+
279+
MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
280+
281+
# For Cygwin, switch paths to Windows format before running java
282+
if $cygwin; then
283+
[ -n "$JAVA_HOME" ] &&
284+
JAVA_HOME=$(cygpath --path --windows "$JAVA_HOME")
285+
[ -n "$CLASSPATH" ] &&
286+
CLASSPATH=$(cygpath --path --windows "$CLASSPATH")
287+
[ -n "$MAVEN_PROJECTBASEDIR" ] &&
288+
MAVEN_PROJECTBASEDIR=$(cygpath --path --windows "$MAVEN_PROJECTBASEDIR")
289+
fi
290+
291+
# Provide a "standardized" way to retrieve the CLI args that will
292+
# work with both Windows and non-Windows executions.
293+
MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $*"
294+
export MAVEN_CMD_LINE_ARGS
295+
296+
WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
297+
298+
# shellcheck disable=SC2086
299+
exec "$JAVACMD" \
300+
$MAVEN_OPTS \
301+
$MAVEN_DEBUG_OPTS \
302+
-classpath "$wrapperJarPath" \
303+
"-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
304+
${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"

0 commit comments

Comments
 (0)