maven的命令程序mvn脚本分析

    最近公司将svn迁移到git,而且使用maven管理代码仓库,所以小小的研究了一下,为自动化持续集成做知识准备,以下是分析了maven的命令程序mvn:
    总体感觉与tomcat的启动脚本startup大同小异

#!/bin/sh
# ----------------------------------------------------------------------------
# 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.
# ----------------------------------------------------------------------------
# ----------------------------------------------------------------------------
# Maven2 Start Up Batch script
#
# Required ENV vars:
# ------------------
#   JAVA_HOME - location of a JDK home dir
#
# Optional ENV vars
# -----------------
#   M2_HOME - location of maven2‘s installed home dir
#   MAVEN_OPTS - parameters passed to the Java VM when running Maven
#     e.g. to debug Maven itself, use
#       set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
#   MAVEN_SKIP_RC - flag to disable loading of mavenrc files
# ----------------------------------------------------------------------------
#如果系统里有多JDK版本,就可以在这里指定JAVA_HOME,这样即使JAVA_HOME环境变量不是这个,也可以从这里弥补
#M2_HOME 也可以在这里指定,maven会在家目录生成.m2目录
#MAVEN_OPTS 这个是设maven启动参数的,有兴趣的同学可以研究下
JAVA_HOME=/usr/java/jdk1.6.0_38
if [ -z "$MAVEN_SKIP_RC" ] ; then
  if [ -f /etc/mavenrc ] ; then
    . /etc/mavenrc
  fi
  if [ -f "$HOME/.mavenrc" ] ; then
    . "$HOME/.mavenrc"
  fi
fi
#如果环境变量MAVEN_SKIP_RC存在,则从下面3个外部文件找是否设置maven的环境变量,
#下面是系统环境检查,和tomcat的startup.sh一曲同工
# OS specific support.  $var _must_ be set to either true or false.
cygwin=false;
darwin=false;
mingw=false
case "`uname`" in
  CYGWIN*) cygwin=true ;;
  MINGW*) mingw=true;;
  Darwin*) darwin=true            
           #
           # Look for the Apple JDKs first to preserve the existing behaviour, and then look
           # for the new JDKs provided by Oracle.
           # 
           if [[ -z "$JAVA_HOME" && -L /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK ]] ; then
             #
             # Apple JDKs
             #
             export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home
           fi
           
           if [[ -z "$JAVA_HOME" && -L /System/Library/Java/JavaVirtualMachines/CurrentJDK ]] ; then
             #
             # Apple JDKs
             #
             export JAVA_HOME=/System/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home
           fi
             
           if [[ -z "$JAVA_HOME" && -L "/Library/Java/JavaVirtualMachines/CurrentJDK" ]] ; then
             #
             # Oracle JDKs
             #
             export JAVA_HOME=/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home
           fi           
           ;;
esac
if [ -z "$JAVA_HOME" ] ; then
  if [ -r /etc/gentoo-release ] ; then
    JAVA_HOME=`java-config --jre-home`
  fi
fi
#此处貌似是为了照顾gentoo这个操作系统,特别加的,属于适应各操作系统方面的代码
if [ -z "$M2_HOME" ] ; then
  ## resolve links - $0 may be a link to maven‘s home
  PRG="$0"
#$0 ----当前shell名
  # need this for relative symlinks
  #test –h File    文件存在并且是一个符号链接(同-L) 
  while [ -h "$PRG" ] ; do
    ls=`ls -ld "$PRG"`
    link=`expr "$ls" : ‘.*-> \(.*\)$‘`
    if expr "$link" : ‘/.*‘ > /dev/null; then
      PRG="$link"
    else
      PRG="`dirname "$PRG"`/$link"
    fi
  done
  #这个是排除软链接,找出真实的命令运行目录
  #如果有童鞋分析过tomcat的startup.sh脚本,就可以发现,上面的脚本基本雷同
  
  
  saveddir=`pwd`
  M2_HOME=`dirname "$PRG"`/..
  # make it fully qualified
  M2_HOME=`cd "$M2_HOME" && pwd`
  cd "$saveddir"
  # echo Using m2 at $M2_HOME
fi
#cd进入mvn的应用目录
# For Cygwin, ensure paths are in UNIX format before anything is touched
if $cygwin ; then
  [ -n "$M2_HOME" ] &&
    M2_HOME=`cygpath --unix "$M2_HOME"`
  [ -n "$JAVA_HOME" ] &&
    JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
  [ -n "$CLASSPATH" ] &&
    CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
fi
# For Migwn, ensure paths are in UNIX format before anything is touched
if $mingw ; then
  [ -n "$M2_HOME" ] &&
    M2_HOME="`(cd "$M2_HOME"; pwd)`"
  [ -n "$JAVA_HOME" ] &&
    JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
  # TODO classpath?
fi
#上面一大串都是适应mingw和cygwin环境的,直接略过,下面才是干货
#test –z 字符串 字符串的长度为零  
#如果没有设置JAVA_HOME,程序就自己去找JAVA_HOME
if [ -z "$JAVA_HOME" ]; then
  javaExecutable="`which javac`"
  if [ -n "$javaExecutable" -a ! "`expr \"$javaExecutable\" : ‘\([^ ]*\)‘`" = "no" ]; then
  #test –n 字符串的长度非零 
  #test 表达式1 –a 表达式2  两个表达式都为真 
    #link=`expr "$ls" : ‘.*-> \(.*\)$‘` 模拟后: expr ‘lrwxrwxrwx 1 root root 19 3月  17 10:12 ./bbb.sh -> /root/shell/test.sh‘ : ‘.*-> \(.*\)$‘
    #很明确的发现是用expr来提取/root/shell/test.sh的内容
    #而这个循环就可以明确其目的,排除命令为链接,找出命令真正的目录,防止后面的命令出错 
    # readlink(1) is not available as standard on Solaris 10.
        #[^]            # 匹配不在指定组内的字符
        #上面的判读,主要是判断which javac,是否存在....
    readLink=`which readlink`
    if [ ! `expr "$readLink" : ‘\([^ ]*\)‘` = "no" ]; then
      javaExecutable="`readlink -f \"$javaExecutable\"`"
      javaHome="`dirname \"$javaExecutable\"`"
      javaHome=`expr "$javaHome" : ‘\(.*\)/bin‘`
      JAVA_HOME="$javaHome"
      export JAVA_HOME
    fi
  fi
fi
#如果没有设置JAVACMD,脚本就会在JAVA_HOME目录下去找
if [ -z "$JAVACMD" ] ; then
  if [ -n "$JAVA_HOME"  ] ; then
    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
      # IBM‘s JDK on AIX uses strange locations for the executables
      JAVACMD="$JAVA_HOME/jre/sh/java"
    else
      JAVACMD="$JAVA_HOME/bin/java"
    fi
  else
    JAVACMD="`which java`"
  fi
fi
#test –x File  文件存在并且可执行 
#javac命令用不了,那就报错了鸟~~~
if [ ! -x "$JAVACMD" ] ; then
  echo "Error: JAVA_HOME is not defined correctly."
  echo "  We cannot execute $JAVACMD"
  exit 1
fi
#没有定义JAVA_HOME,脚本有自己找不到,就会在这里报错
if [ -z "$JAVA_HOME" ] ; then
  echo "Warning: JAVA_HOME environment variable is not set."
fi
CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
# For Cygwin, switch paths to Windows format before running java
if $cygwin; then
  [ -n "$M2_HOME" ] &&
    M2_HOME=`cygpath --path --windows "$M2_HOME"`
  [ -n "$JAVA_HOME" ] &&
    JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
  [ -n "$CLASSPATH" ] &&
    CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
fi
#上面一堆代码的目的,就是为了下面一句代码提供变量.....
exec "$JAVACMD"   $MAVEN_OPTS   -classpath "${M2_HOME}"/boot/plexus-classworlds-*.jar   "-Dclassworlds.conf=${M2_HOME}/bin/m2.conf"   "-Dmaven.home=${M2_HOME}"    ${CLASSWORLDS_LAUNCHER} "[email protected]"
时间: 2024-10-25 21:49:44

maven的命令程序mvn脚本分析的相关文章

maven 打包命令package,install, deploy 的区别

maven 打包命令区别 mvn clean package 依次执行了clean, resource, compile, testResources, testCompile, test, jar(打包)等7个阶段 package命令完成了项目编译,单元测试, 打包功能, 但没有把打好的包部署到本地maven仓库和远程的maven私服仓库 mvn clean install 依次执行了clean, resource, compile, testResources, testCompile, t

程序必修改课之maven实用命令

总结一下我在工作中用的比较多的一些Maven命令. 1. mvn clean 这个命令可以清理maven编译的target目录. 扩展:我们在建目录结构时一般都会建议一个<packaging>pom</packaging>的parent工程,这样我们在parent目录中运行mvn clean命令即可清理所有的子工程的target. 目录结构举例: ...... <groupId>com.tgb.lk</groupId> <artifactId>l

hadoop启动脚本分析及常见命令

进程------------------ [hdfs]start-dfs.sh NameNode NN DataNode DN SecondaryNamenode 2NN [yarn]start-yarn.sh ResourceMananger RM NodeManager NM 脚本分析------------------- sbin/start-all.sh -------------- libexec/hadoop-config.sh start-dfs.sh start-yarn.sh

转:maven常用命令介绍

mvn 3.0.4 创建maven项目命令 mvn  archetype:generate   -DgroupId=damocles-autocredit -DartifactId=damocles-autocredit  -DarchetypeArtifactId=maven-archetype-quickstart     -DinteractiveMode=false  -X 1 下载源代码:mvn dependency:sources -DdownloadSources=true -Dd

maven常用命令介绍

mvn 3.0.4 创建maven项目命令 mvn  archetype:generate   -DgroupId=damocles-autocredit -DartifactId=damocles-autocredit  -DarchetypeArtifactId=maven-archetype-quickstart     -DinteractiveMode=false  -X 1 下载源代码:mvn dependency:sources -DdownloadSources=true -Dd

maven集成命令-U -B -P -e -X

maven -U clean compile install -e -X -Dmaven.test.skip=true 在持续集成服务器上使用怎样的 mvn 命令集成项目,这个问题乍一看答案很显然,不就是 mvn clean install 么?事实上比较好的集成命令会稍微复杂些,下面是一些总结: 不要忘了clean: clean能够保证上一次构建的输出不会影响到本次构建. 使用deploy而不是install: 构建的SNAPSHOT输出应当被自动部署到私有Maven仓库供他人使用,这一点在前

Maven常用命令

Maven的命令: 在控制台运行maven程序的话首先在这里建立有一个文件夹 然后把test1里面的pom复制到test2里面来 然后在里面建立一个源码包和test测试 然后在main里面跟test在写代码,写个java 然后在java包里面写com包,然后在com包里面写代码 然后改一下pom里面的工程 常用命令: Mvn comlile //这个是编译的操作 Mvn test-comlile //这是编译后测试,测试出来给我一个报告 Mvn test //调用测试+编译 Mvn packag

Maven常用命令:

Maven库: http://repo2.maven.org/maven2/ Maven依赖查询: http://mvnrepository.com/ 一,Maven常用命令: 1. 创建Maven的普通Java项目: mvn archetype:create -DgroupId=packageName -DartifactId=projectName 2. 创建Maven的Web项目: mvn archetype:create -DgroupId=packageName -DartifactI

Hadoop的shell脚本分析

你会发现hadoop-daemon.sh用于启动单独的本机节点 而hadoop-daemons.sh 会批量的ssh到别的机器启动 前记: 这些天一直学习hadoop,学习中也遇到了许多的问题,主要是对hadoop的shell脚本和hadoop的源码概念不够清楚,所以我就对hadoop的bin目录下的shell脚本进行了研究,有一些成果想记录下来,也希望大家前来批评指正. 分析原因: 很多hadoop的初学者对hadoop的脚本不是很清楚,不知道为什么可以在命令行中启动hadoop,也不知道为什