Cannot build m2 with spaces in M2_HOME and/or JAVA_HOME
-------------------------------------------------------

         Key: MNG-372
         URL: http://jira.codehaus.org/browse/MNG-372
     Project: m2
        Type: Bug
    Versions: 2.0-alpha-1    
 Environment: Windows XP, Cygwin.
    Reporter: Mark Hobson
 Attachments: patch

There are numerous problems when trying to build m2 in Windows when JAVA_HOME 
or M2_HOME contains spaces.  The attached patch fixes enough of the scripts to 
build m2 under cygwin, but there still exist several major flaws when using the 
.bat versions.

To detail the various problems, I shall annotate the patch here:

> Index: m2-bootstrap-all.sh
> ===================================================================
> @@ -1,7 +1,7 @@
> -[ -z $JAVA_HOME ] && echo && echo 'You must set $JAVA_HOME to use mboot!' && 
> echo && exit 1
> +[ -z "$JAVA_HOME" ] && echo && echo 'You must set $JAVA_HOME to use mboot!' 
> && echo && exit 1

Quote for spaces in JAVA_HOME.
 
> @@ -19,7 +19,11 @@
> -  ARGS="$ARGS -Dmaven.home=$M2_HOME"
> +  if [ -n "$ARGS" ]; then
> +    ARGS="$ARGS -Dmaven.home=$M2_HOME"
> +  else
> +    ARGS="-Dmaven.home=$M2_HOME"
> +  fi

Previously, if no ARGS are supplied then "$ARGS" equates to " 
-Dmaven.home=$M2_HOME" which is not recognised by javac and a typical -D arg.  
Basically ARGS cannot start or end with a space when later quoted.
 
> @@ -39,7 +43,7 @@
> -  $JAVACMD $ARGS $MAVEN_OPTS -jar mboot.jar
> +  "$JAVACMD" "$ARGS" $MAVEN_OPTS -jar mboot.jar

First quote for spaces in JAVA_HOME, second for spaces in M2_HOME.  Not sure if 
"$ARGS" works for multiple arguments with spaces, i.e. "-Dprop1=C:/Program 
Files/a -Dprop2=C:/Program Files/b".  From previous experience I seem to 
remember having to quote each -D seperately..

> Index: maven-core/src/bin/m2.bat
> ===================================================================
> @@ -127,7 +127,7 @@
> -%MAVEN_JAVA_EXE% %MAVEN_OPTS% -classpath 
> %M2_HOME%\core\boot\classworlds-*.jar 
> "-Dclassworlds.conf=%M2_HOME%\bin\m2.conf" "-Dmaven.home=%M2_HOME%" 
> org.codehaus.classworlds.Launcher %MAVEN_CMD_LINE_ARGS%
> +%MAVEN_JAVA_EXE% %MAVEN_OPTS% -classpath 
> "%M2_HOME%\core\boot\classworlds-1.1-alpha-1.jar" 
> "-Dclassworlds.conf=%M2_HOME%\bin\m2.conf" "-Dmaven.home=%M2_HOME%" 
> org.codehaus.classworlds.Launcher %MAVEN_CMD_LINE_ARGS%

m2.bat gets called eventually via the script even under cygwin, hence this fix. 
 Normal quote for M2_HOME in -classpath here, but also the classworlds-*.jar 
part does not work under Windows when fully qualified.  i.e. Within 
M2_HOME/core/boot a javac -cp classworlds-*.jar will work, but not once it's 
fully qualified as it is here.  Not an ideal solution as we have to hardcode 
the classworlds version.
 
> Index: maven-core/src/bin/m2
> ===================================================================
> @@ -126,7 +126,7 @@
> -exec $JAVACMD \
> +exec "$JAVACMD" \

Quoted for spaces in JAVA_HOME.

> Index: maven-mboot2/build
> ===================================================================
> @@ -9,8 +9,8 @@
> -$JAVA_HOME/bin/javac -g -d ${classesDir} `find ${srcDir} -name '*.java'`
> +"$JAVA_HOME/bin/javac" -g -d ${classesDir} `find ${srcDir} -name '*.java'`

Quoted for spaces in JAVA_HOME.
 
> -( cd ${classesDir} ; $JAVA_HOME/bin/jar -cfm ../mboot.jar ../../manifest.txt 
> * )
> +( cd ${classesDir} ; "$JAVA_HOME/bin/jar" -cfm ../mboot.jar 
> ../../manifest.txt * )

Quoted for spaces in JAVA_HOME.
 
> Index: maven-core-it/maven-core-it.sh
> ===================================================================
> @@ -25,9 +25,5 @@
> -if [ ! -z "$M2_HOME" ]; then
> -  jvm_args="$jvm_args -Dmaven.home=$M2_HOME"
> -fi

Potentially controversial, but maven-core-it.sh receives -Dmaven.home in it's 
args from the parent calling script, so applying this again here causes the 
following args to be used:

    -Dmaven.home=C:/Program Files/maven2 -Dmaven.home=C:/Program Files/maven2

Which when quoted, results in maven.home equalling "C:/Program Files/maven2 
-Dmaven.home=C:/Program Files/maven2".  This is a symptom of quoting multiple 
args with spaces as described above.

> +java "$jvm_args" -cp "$cp" $verifier
> -java $jvm_args -cp "$cp" $verifier

Quoted for spaces in M2_HOME.

I started to look at fixing the bat files for the pure Windows build, but came 
across fundamental problems in maven-mboot2/build.bat - the @argfile form of 
javac only works under Windows if any paths with spaces are quoted within it.  
So knowing the 'power' of DOS, this didn't seem an easy task.

All of this investigation led me to ask why you guys didn't use Ant instead of 
native scripts?!

Any feedback would be welcome, cheers.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://jira.codehaus.org/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to