zoukankan      html  css  js  c++  java
  • maven源码分析- mvn.bat分析

    第一次知道MAVEN是在2008年,当时想分析geoserver这个开源项目,发现该项目采用了maven进行项目管理,当时粗略的学习了一下。真正在工作中使用是在09年下半年,个人感觉使用起来还是非常好,特别是在jar包的管理上规范了很多,而且项目中添加jar包或下源码都十分方便,但是团队中的成员总是有个别人使用得很痛苦,不是这个找不到,就是发布项目出问题,鉴于此,我动了分析源码的念头。

          先通过svn从 https://svn.apache.org/repos/asf/maven/maven-3/trunk 上checkout了一份源码。项目结构如下图:

       

    由于使用maven基本是通过其bin目录下的mvn.bat命令为入口,所以有必要先了解下该批处理文件,把多余的注释去掉后,该文件显示如下:

    复制代码
      1 @echo off
      2 @REM enable echoing my setting MAVEN_BATCH_ECHO to 'on'
      3 @if "%MAVEN_BATCH_ECHO%" == "on"  echo %MAVEN_BATCH_ECHO%
      4 
      5 @REM set %HOME% to equivalent of $HOME
      6 if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
      7 
      8 @REM Execute a user defined script before this one
      9 if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
     10 if exist "%HOME%mavenrc_pre.bat" call "%HOME%mavenrc_pre.bat"
     11 :skipRcPre
     12 
     13 set ERROR_CODE=0
     14 
     15 @REM set local scope for the variables with windows NT shell
     16 if "%OS%"=="Windows_NT" @setlocal
     17 if "%OS%"=="WINNT" @setlocal
     18 
     19 @REM ==== START VALIDATION ====
     20 if not "%JAVA_HOME%" == "" goto OkJHome
     21 
     22 echo.
     23 echo ERROR: JAVA_HOME not found in your environment.
     24 echo Please set the JAVA_HOME variable in your environment to match the
     25 echo location of your Java installation
     26 echo.
     27 goto error
     28 
     29 :OkJHome
     30 if exist "%JAVA_HOME%injava.exe" goto chkMHome
     31 
     32 echo.
     33 echo ERROR: JAVA_HOME is set to an invalid directory.
     34 echo JAVA_HOME = "%JAVA_HOME%"
     35 echo Please set the JAVA_HOME variable in your environment to match the
     36 echo location of your Java installation
     37 echo.
     38 goto error
     39 
     40 :chkMHome
     41 if not "%M2_HOME%"=="" goto valMHome
     42 
     43 if "%OS%"=="Windows_NT" SET "M2_HOME=%~dp0.."
     44 if "%OS%"=="WINNT" SET "M2_HOME=%~dp0.."
     45 if not "%M2_HOME%"=="" goto valMHome
     46 
     47 echo.
     48 echo ERROR: M2_HOME not found in your environment.
     49 echo Please set the M2_HOME variable in your environment to match the
     50 echo location of the Maven installation
     51 echo.
     52 goto error
     53 
     54 :valMHome
     55 
     56 :stripMHome
     57 if not "_%M2_HOME:~-1%"=="_" goto checkMBat
     58 set "M2_HOME=%M2_HOME:~0,-1%"
     59 goto stripMHome
     60 
     61 :checkMBat
     62 if exist "%M2_HOME%inmvn.bat" goto init
     63 
     64 echo.
     65 echo ERROR: M2_HOME is set to an invalid directory.
     66 echo M2_HOME = "%M2_HOME%"
     67 echo Please set the M2_HOME variable in your environment to match the
     68 echo location of the Maven installation
     69 echo.
     70 goto error
     71 @REM ==== END VALIDATION ====
     72 
     73 :init
     74 @REM Decide how to startup depending on the version of windows
     75 
     76 @REM -- Windows NT with Novell Login
     77 if "%OS%"=="WINNT" goto WinNTNovell
     78 
     79 @REM -- Win98ME
     80 if NOT "%OS%"=="Windows_NT" goto Win9xArg
     81 
     82 :WinNTNovell
     83 
     84 @REM -- 4NT shell
     85 if "%@eval[2+2]" == "4" goto 4NTArgs
     86 
     87 @REM -- Regular WinNT shell
     88 set MAVEN_CMD_LINE_ARGS=%*
     89 goto endInit
     90 
     91 @REM The 4NT Shell from jp software
     92 :4NTArgs
     93 set MAVEN_CMD_LINE_ARGS=%$
     94 goto endInit
     95 
     96 :Win9xArg
     97 @REM Slurp the command line arguments.  This loop allows for an unlimited number
     98 @REM of agruments (up to the command line limit, anyway).
     99 set MAVEN_CMD_LINE_ARGS=
    100 :Win9xApp
    101 if %1a==a goto endInit
    102 set MAVEN_CMD_LINE_ARGS=%MAVEN_CMD_LINE_ARGS% %1
    103 shift
    104 goto Win9xApp
    105 
    106 @REM Reaching here means variables are defined and arguments have been captured
    107 :endInit
    108 SET MAVEN_JAVA_EXE="%JAVA_HOME%injava.exe"
    109 
    110 @REM -- 4NT shell
    111 if "%@eval[2+2]" == "4" goto 4NTCWJars
    112 
    113 @REM -- Regular WinNT shell
    114 for %%i in ("%M2_HOME%"ootplexus-classworlds-*) do set CLASSWORLDS_JAR="%%i"
    115 goto runm2
    116 
    117 @REM The 4NT Shell from jp software
    118 :4NTCWJars
    119 for %%i in ("%M2_HOME%bootplexus-classworlds-*") do set CLASSWORLDS_JAR="%%i"
    120 goto runm2
    121 
    122 @REM Start MAVEN2
    123 :runm2
    124 set CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
    125 %MAVEN_JAVA_EXE% %MAVEN_OPTS% -classpath %CLASSWORLDS_JAR% "-Dclassworlds.conf=%M2_HOME%inm2.conf" "-Dmaven.home=%M2_HOME%" %CLASSWORLDS_LAUNCHER% %MAVEN_CMD_LINE_ARGS%
    126 if ERRORLEVEL 1 goto error
    127 goto end
    128 
    129 :error
    130 if "%OS%"=="Windows_NT" @endlocal
    131 if "%OS%"=="WINNT" @endlocal
    132 set ERROR_CODE=1
    133 
    134 :end
    135 @REM set local scope for the variables with windows NT shell
    136 if "%OS%"=="Windows_NT" goto endNT
    137 if "%OS%"=="WINNT" goto endNT
    138 
    139 @REM For old DOS remove the set variables from ENV - we assume they were not set
    140 @REM before we started - at least we don't leave any baggage around
    141 set MAVEN_JAVA_EXE=
    142 set MAVEN_CMD_LINE_ARGS=
    143 goto postExec
    144 
    145 :endNT
    146 @endlocal & set ERROR_CODE=%ERROR_CODE%
    147 
    148 :postExec
    149 
    150 if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
    151 if exist "%HOME%mavenrc_post.bat" call "%HOME%mavenrc_post.bat"
    152 :skipRcPost
    153 
    154 @REM pause the batch file if MAVEN_BATCH_PAUSE is set to 'on'
    155 if "%MAVEN_BATCH_PAUSE%" == "on" pause
    156 
    157 if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
    158 
    159 cmd /C exit /B %ERROR_CODE%
    复制代码

     

    下面对上述批处理文件展开详细分析,首先需要把一些批处理常用命令讲解一下:

    (1) @  符号的作用是命令行回显屏蔽符,可以在其他批处理命令前加@符来控制该命令是否回显在控制台窗口

         比如批处理中REM与@REM的区别:

         REM是批处理中的注释命令,@REM的作用与REM相同,只不过在回显上有差别,如果echo off,@要与否是无所谓的.但是,如果echo on,在运行的时 

          候,不带@的行的DOS命令都会被回显,包括注释

    (2) %HOMEDRIVE%和%HOMEPATH%

         %homedrive%指操作系统所在的盘,如装在C盘,则为c:

         %HOMEPATH%指登录当前操作系统的用户的用户目录,如登录用户为administrator, 则一般为Documents and Settingsadministrator  

    (3) ~ 波浪号的作用是截取字符串

         如:  假设set str=123456789

           则 %str:~0,1% 表示要从字符串的第0位直到截取字符串最左边一个字符后的位置。截取结果为1

               %str:~0,-1%表示要从字符串的第0位直到截取字符串最右边一个字符后的位置。截取结是为12345678

    (4) %~dp0  : 获取当前批处理的运行目录路径

    (5) setlocal :启动批处理文件中环境变量的本地化,和endlocal配套使用,使得某些变量的变化只是维持在setlocal和endlocal之间 ,如:

        set var=123     setlocal        set var=abcd     endlocal     echo %var%

        当echo时,var变量应为123

    (6) %[1-9]表示参数,参数是指在运行批处理文件时在文件名后加的以空格(或者Tab)分隔的字符串。变量可以从%0到%9,%0表示批处理命令本身,其它参

         数字符串用%1到%9顺序表示。

    (7) shift ,  去掉第一个参数,后面的参数依次向前移

     

    [本文转载自胡欣老师]

  • 相关阅读:
    【转】C#中判断扫描枪输入与键盘输入
    根据名称分组,选择最大日期和最小日期的数据,并显示在一行上
    C#如何判断我的程序已经有一个实例正在运行
    消息队列篇
    Redis面试笔记(二)雪崩、穿透、击穿三连问
    MySQL基础
    Redis面试笔记(一)
    Java多线程(二)
    Java多线程(一)
    Elastic Search之布尔查询
  • 原文地址:https://www.cnblogs.com/china-soft/p/3246191.html
Copyright © 2011-2022 走看看