你的位置:首页 > 数据库

[数据库]1.Storm 安装手册和提交Topology


目录

(一)搭建单机storm集群

一、下载所需要的资源

二、资源解压

三、安装JDK

四、安装依赖的库文件

五、安装ZMQ

六、安装jzmq

七、启动zookeeper

八、启动storm

九、在UI端访问

十、编译storm-start jar包

十一、storm-starter源码导出

十二、提交Topology

(二)搭建多机storm集群

一、基本设置

二、修改配置文件

三、启动集群

四、在UI端口访问

五、提交Topology

附一

 

Storm 安装手册

(一)搭建单机storm集群

一、下载所需要的资源

Storm:

http://storm-project.net/downloads.html

(0.9.3)apache-storm-0.9.3.tar.gz

Zookeeper:

http://www.apache.org/dyn/closer.cgi/zookeeper/

(3.4.6)zookeeper-3.4.6.tar.gz

ZMQ:

http://download.zeromq.org/

(2.1.7)zeromq-2.1.7.tar.gz

jzmq:

http://github.com/nathanmarz/jzmq/archive/master.zip

jzmq-master.zip

二、资源解压

下载完成后将资源放在自己指定的目录下

解压

tar -xvf zookeeper-3.4.6.tar.gztar -xvf apache-storm-0.9.3.tar.gztar -xvf zeromq-2.1.7.tar.gzunzip jzmq-master.zip

 

三、安装JDK

安装openjdk

安装命令:

sudo apt-get install openjdk-7-jdk

安装完成后修改环境变量,修改文件etc/profile

vim /etc/profile

修改以下内容:

export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-i386export CLASSPATH=$JAVA_HOME/libexport PATH=$JAVA_HOME/bin:$PATH

修改完成后,使配置文件生效

source /etc/profile

四、安装依赖的库文件

运行以下命令对所需要的库文件进行安装,也可使用yum进行安装

sudo apt-get install libtoolsudo apt-get install autoconfsudo apt-get install automakesudo apt-get install g++sudo apt-get install uuid-devsudo apt-get install uuidsudo apt-get install e2fsprogssudo apt-get install python

五、安装ZMQ

进入zero相应目录下,运行以下命令进行安装

cd zeromq-2.1.7

./configure

若出现如下错误

configure: error: cannot link with -luuid, install uuid-dev.

解决方案如下:

yum install uuid-dev 提示找不到该依赖包  (需从网上下载安装yum)

yum install uuid*     直接用* ok

./configure  再次运行configure还是报错

configure: error: cannot link with -luuid, install uuid-dev.

上网搜索可能是还缺另外一个包

yum install e2fsprogs* ok

make

sudo make install

sudo ldconfig

六、安装jzmq

进入jzmq相应目录下,运行以下命令进行安装

cd jzmq-master

./autogen.sh

./configure

make

sudo make install

若make过程出现如下错误

***No rule to make target ‘classdist_noinst.stamp’,needed by ‘org、zeromq/ZMQ.class’. Stop

解决方法,运行如下命令解决

touch src/classdist_noinst.stamp

cd src/org/zeromq

javac *.java

cd –

make

sudo make install

七、启动zookeeper

进入zookeeper相应目录

cd zookeeper-3.4.6/

重命名./conf/zoo_sample.cfg为./conf/zoo.cfg

mv ./conf/zoo_sample.cfg ./conf/zoo.cfg

运行命令启动zookeeper

bin/zkServer.sh start

检查zookeeper是否启动成功zkServer.sh status

bin/zkCli.sh –server 127.0.0.1:2181

在出现的交互式窗口中运行

ls /

八、启动storm

进入storm相应目录,启动storm相应服务

cd apache-storm-0.9.3/bin

./storm nimbus&./storm supervisor&./storm ui&

九、在UI端访问

在桌面打开连接http://localhost:8080,此时能够看见Storm UI界面

wps3F67.tmp

十、编译storm-start jar包

在运行起来的集群上提交一个Topology,使用storm-starter做示范

安装git工具

sudo apt-get install git

安装leiningen工具(2.0.0以上版本),按照https://github.com/technomancy/leiningen的步骤安装

确保java版本在6以上

下载lein脚本(我下载的lein脚本附在最后,附一),命名为lein:

cd ~/wfm-storm/apache-storm-0.9.3/bin

vim lein

将附一的脚本粘贴到lein文件中并保存

chmod 755 ~/bin/lein

运行lein

./lein

运行lein报如下错误

“Failed to download

https://github.com/technomancy/leiningen/releases/download/2.5.0/leiningen-2.5.0-standalone.jar  (exit code 7) It's possible your HTTP client's certificate store does not have the correct certificate authority needed. This is often caused by an out-of-date version of libssl. It's also possible that you're behind a firewall and haven't set HTTP_PROXY and HTTPS_PROXY.“

解决方法:

export HTTP_CLIENT="wget --no-check-certificate -O"

./lein

export PATH=" ~/wfm-storm/apache-storm-0.9.3/bin/:$PATH"(在配置文件中加入这句)

下载storm-start源码保存在~/wfm-storm/storm-starter中

cd ~/wfm-storm/

git clone git://github.com/nathanmarz/storm-starter.git

依次执行以下命令创建项目jar包

cd storm-starter/

lein deps //下载相应的依赖包

lein compile //编译

lein install //安装打包

报backtype.storm.LocalCluster和backtype.storm.LocalDRPC类找不到:

Compiling backtype.storm.testing4j

Exception in thread "main" java.lang.ClassNotFoundException: backtype.storm.LocalCluster, compiling:(testing4j.clj:1)

        at clojure.lang.Compiler$InvokeExpr.eval(Compiler.java:3387)

        at clojure.lang.Compiler.compile1(Compiler.java:7035)

        at clojure.lang.Compiler.compile1(Compiler.java:7025)

        at clojure.lang.Compiler.compile(Compiler.java:7097)

        at clojure.lang.RT.compile(RT.java:387)

        at clojure.lang.RT.load(RT.java:427)

        at clojure.lang.RT.load(RT.java:400)

        at clojure.core$load$fn__4890.invoke(core.clj:5415)

        at clojure.core$load.doInvoke(core.clj:5414)

解决方法:

修改storm-core/src/clj/backtype/storm/testing4j.clj

和storm-core/src/clj/storm/trident/testing.clj,分别引用这两个类:

testing4j.clj:

  1 (ns backtype.storm.testing4j

  2   (:import [java.util Map List Collection ArrayList])

  3   (:require [backtype.storm.LocalCluster :as LocalCluster])

testing.clj:

  1  (ns storm.trident.testing)

  2   (:require [backtype.storm.LocalDRPC :as LocalDRPC])

安装时出现jdk版本问题

sudo apt-get install openjdk-7-jdk

执行之后会将JDK安装到/usr/lib/jvm/java-7-openjdk-i386/

通过update-alternatives选择系统中使用的java

sudo update-alternatives --config java

有 3 个候选项可用于替换 java (提供 /usr/bin/java)。

选择  路径                         优先级  状态

------------------------------------------------------------

* 0   /usr/lib/jvm/java-6-openjdk-i386/jre/bin/java   1061      自动模式

1    /usr/lib/jvm/java-6-openjdk-i386/jre/bin/java   1061      手动模式

2    /usr/lib/jvm/java-6-sun/jre/bin/java            63        手动模式

3    /usr/lib/jvm/java-7-openjdk-i386/jre/bin/java   1051      手动模式

要维持当前值[*]请按回车键,或者键入选择的编号:3      

update-alternatives: 使用 /usr/lib/jvm/java-7-openjdk-i386/jre/bin/java 来提供 /usr/bin/java (java),于 手动模式 中。

实际是将/usr/bin/java链接到JDK7上,保证执行java命令后,实际运行的是我们的目标版本

java -version

除了java外,还有javac、jar、javah、javap、jps、jconsole等

sudo update-alternatives --config javac

sudo update-alternatives --config jar

sudo update-alternatives --config javah

sudo update-alternatives --config javap

sudo update-alternatives --config jps

sudo update-alternatives --config jconsole

补充:jps -lv  用于查看java程序的启动参数,如java版本

修改各个环境变量

sudo vim /etc/profile

export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/

export CLASSPATH=$JAVA_HOME/lib

export PATH=$JAVA_HOME/bin:$PATH

source  /etc/profile

sudo vim /etc/environment

CLASSPATH=.:/usr/lib/jvm/java-7-openjdk-amd64/lib#

JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/source /etc/environment

sudo vim ~/.bashrc

export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/

export CLASSPATH=$JAVA_HOME/lib

export PATH=$JAVA_HOME/bin:$PATH

source ~/.bashrc

创建好的jar包storm-starter-0.0.1-SNAPSHOT.jar位于target目录下

十一、storm-starter源码导出

获取storm-starter源码

cd ~/wfm-storm

git clone git://github.com/apache/storm.git

cd storm/examples/storm-starter

storm-starter简介

storm-starter包含很多使用storm的例子。如果是第一次使用storm,建议从以下三个例子(topologies)入手:

- ExclamationTopology: 基础的topology,全部都是使用java写的

- WordCountTopology: 基础的topology ,利用multilang使用Python实现的

- ReachTopology: storm之上的复杂的DRPC例子

熟悉这几个例子之后,可看看其他的一些topologies(src/jvm/storm/starter/),其中有更多advanced的实现例子

在maven上使用storm-starter,安装maven(3.x)

下载相应maven版本(http://maven.apache.org/download.cgi),例如apache-maven-3.2.5-bin.tar.gz

解压下载的包

tar -zxf apache-maven-3.2.5-bin.tar.gz

修改环境变量M2_HOME

sudo vim /etc/profile

添加如下代码:

export M2_HOME=/home/wamdm/wfm-storm/apache-maven-3.2.5export M2=$M2_HOME/binexport MAVEN_OPTS="-Xms256m -Xmx512m"export PATH=$M2:$PATH

source /etc/profile

运行mvn –version查看安装是否成功.

wps3F68.tmp

在maven上运行topologies

storm-starter topologies可以使用maven-exec-plugin执行

例如:在本地模式下编译并且运行 WordCountTopology

$ mvn compile exec:java -Dstorm.topology=storm.starter.WordCountTopology

也可以使用Maven运行clojure topologies

$ mvn compile exec:java -Dstorm.topology=storm.starter.clj.word_count

打包strom-starter用于storm集群

mvn package

运行例子:

# Example 1: Run the RollingTopWords in local mode (LocalCluster)

$ storm jar storm-starter-*-jar-with-dependencies.jar storm.starter.RollingTopWords

# Example 2: Run the RollingTopWords in remote/cluster mode,

# under the name "production-topology"

$ storm jar storm-starter-*-jar-with-dependencies.jar storm.starter.RollingTopWords production-topology remote

十二、提交Topology

进入storm文件夹的bin目录中,运行以下命令提交Topology

./storm jar ~/project/storm-starter/target/storm-starter-0.0.1-SNAPSHOT.jar storm.starter.WordCount Topology wordcount

等待提交结束,刷新ui页面,可以看到提交的“Wordcount”Topology,点击Wordcount可以看到其详细的运行情况

停止storm Topology

storm kill :{toponame}

(二)搭建多机storm集群

一、基本设置

首先在每台机器上都搭建单机集群

wamdm1作为Nimbus(192.168.0.11)

wamdm2作为Zookeeper(192.168.0.12)

wamdm3作为Supervisor(192.168.0.13)

wamdm4作为Supervisor(192.168.0.14)

二、修改配置文件

修改wamdm1、wamdm3、wamdm4上的storm.yaml

(~/wfm-storm/apache-storm-0.9.3/conf)

进入conf目录

cd ~/wfm-storm/apache-storm-0.9.3/conf

修改配置文件

vim storm.yaml

将文件中添加如下代码

storm.zookeeper.servers:

- "192.168.0.12"

# - "192.168.0.13"

nimbus.host: "192.168.0.11"

#ui.port: 83

supervisor.slots.ports:

- 6700

- 6701

- 6702

- 6703

可用参数解释:

java.library.path:该配置项配置启动storm所需lib包的路径(默认可不用配置)

storm.zookeeper.servers:该配置项配置了当前集群中所有ZooKeeper机器的IP地址(这里我们只使用wamdm1作为Zookeeper服务器)

nimbus.host:该配置项指明了Nimbus机器的IP地址

ui.port:该配置项配置了Storm UI使用的端口。(默认使用8080端口)

supervisor.slots.ports:该配置项指明了一台Supervisor机器上所有可以使用的slot信息,也就是端口号。表明该机器上最多可以启动4个worker

Storm还提供了很多其他的配置项,需要时可查相应的document

三、启动集群

在wamdm2上启动zookeeper

bin/zkServer.sh start

检查zookeeper是否启动成功zkServer.sh status

bin/zkCli.sh –server 127.0.0.1:2181

在出现的交互式窗口中运行

ls /

在wamdm1上启动nimbus和ui

cd apache-storm-0.9.3/bin

./storm nimbus

./storm ui

在wamdm3上启动supervisor

cd apache-storm-0.9.3/bin

./storm supervisor

在wamdm4上启动supervisor

cd apache-storm-0.9.3/bin

./storm supervisor

四、在UI端口访问

在桌面打开连接http://192.168.0.11:8080,此时能够看见Storm集群

wps3F79.tmp

五、提交Topology

在wamdm1(Nimbus所在机器)上提交WordCountTopology到集群中,刷新ui页面,就能够看到提交的Topology了。

附一

lein

 1 #!/usr/bin/env bash 2  3 # Ensure this file is executable via `chmod a+x lein`, then place it 4  5 # somewhere on your $PATH, like ~/bin. The rest of Leiningen will be 6  7 # installed upon first run into the ~/.lein/self-installs directory. 8  9 export LEIN_VERSION="2.5.0" 10  11 case $LEIN_VERSION in 12  13   *SNAPSHOT) SNAPSHOT="YES" ;; 14  15   *) SNAPSHOT="NO" ;; 16  17 esac 18  19 if [[ "$OSTYPE" == "cygwin" ]] || [[ "$OSTYPE" == "msys" ]]; then 20  21   delimiter=";" 22  23 else 24  25   delimiter=":" 26  27 fi 28  29 if [[ "$OSTYPE" == "cygwin" ]]; then 30  31  cygwin=true 32  33 else 34  35  cygwin=false 36  37 fi 38  39 function make_native_path { 40  41   # ensure we have native paths 42  43   if $cygwin && [[ "$1" == /* ]]; then 44  45   echo -n "$(cygpath -wp "$1")" 46  47   elif [[ "$OSTYPE" == "msys" && "$1" == /?/* ]]; then 48  49   echo -n "$(sh -c "(cd $1 2</dev/null && pwd -W) || echo $1 | sed 's/^\\/\([a-z]\)/\\1:/g'")" 50  51   else 52  53   echo -n "$1" 54  55   fi 56  57 } 58  59 # usage : add_path PATH_VAR [PATH]... 60  61 function add_path { 62  63   local path_var="$1" 64  65   shift 66  67   while [ -n "$1" ];do 68  69     # http://bashify.com/?Useful_Techniques:Indirect_Variables:Indirect_Assignment 70  71     if [[ -z ${!path_var} ]]; then 72  73      export ${path_var}="$(make_native_path "$1")" 74  75     else 76  77      export ${path_var}="${!path_var}${delimiter}$(make_native_path "$1")" 78  79     fi 80  81   shift 82  83   done 84  85 } 86  87 function download_failed_message { 88  89   echo "Failed to download $1 (exit code $2)" 90  91   echo "It's possible your HTTP client's certificate store does not have the" 92  93   echo "correct certificate authority needed. This is often caused by an" 94  95   echo "out-of-date version of libssl. It's also possible that you're behind a" 96  97   echo "firewall and haven't set HTTP_PROXY and HTTPS_PROXY." 98  99 }100 101 function self_install {102 103  if [ -r "$LEIN_JAR" ]; then104 105   echo "The self-install jar already exists at $LEIN_JAR."106 107   echo "If you wish to re-download, delete it and rerun \"$0 self-install\"."108 109   exit 1110 111  fi112 113  echo "Downloading Leiningen to $LEIN_JAR now..."114 115  mkdir -p "$(dirname "$LEIN_JAR")"116 117  LEIN_URL="https://github.com/technomancy/leiningen/releases/download/$LEIN_VERSION/leiningen-$LEIN_VERSION-standalone.jar"118 119  $HTTP_CLIENT "$LEIN_JAR.pending" "$LEIN_URL"120 121  local exit_code=$?122 123  if [ $exit_code == 0 ]; then124 125    # TODO: checksum126 127    mv -f "$LEIN_JAR.pending" "$LEIN_JAR"128 129  else130 131    rm "$LEIN_JAR.pending" 2> /dev/null132 133    download_failed_message "$LEIN_URL" "$exit_code"134 135    exit 1136 137  fi138 139 }140 141 if [ `id -u` -eq 0 ] && [ "$LEIN_ROOT" = "" ]; then142 143   echo "WARNING: You're currently running as root; probably by accident."144 145   echo "Press control-C to abort or Enter to continue as root."146 147   echo "Set LEIN_ROOT to disable this warning."148 149   read _150 151 fi152 153 NOT_FOUND=1154 155 ORIGINAL_PWD="$PWD"156 157 while [ ! -r "$PWD/project.clj" ] && [ "$PWD" != "/" ] && [ $NOT_FOUND -ne 0 ]158 159 do160 161   cd ..162 163   if [ "$(dirname "$PWD")" = "/" ]; then164 165     NOT_FOUND=0166 167     cd "$ORIGINAL_PWD"168 169   fi170 171 done172 173 export LEIN_HOME="${LEIN_HOME:-"$HOME/.lein"}"174 175 for f in "$LEIN_HOME/leinrc" ".leinrc"; do176 177  if [ -e "$f" ]; then178 179   source "$f"180 181  fi182 183 done184 185 if $cygwin; then186 187   export LEIN_HOME=`cygpath -w "$LEIN_HOME"`188 189 fi190 191 LEIN_JAR="$LEIN_HOME/self-installs/leiningen-$LEIN_VERSION-standalone.jar"192 193 # normalize $0 on certain BSDs194 195 if [ "$(dirname "$0")" = "." ]; then196 197   SCRIPT="$(which $(basename "$0"))"198 199 else200 201   SCRIPT="$0"202 203 fi204 205 # resolve symlinks to the script itself portably206 207 while [ -h "$SCRIPT" ] ; do208 209   ls=`ls -ld "$SCRIPT"`210 211   link=`expr "$ls" : '.*-> \(.*\)$'`212 213   if expr "$link" : '/.*' > /dev/null; then214 215     SCRIPT="$link"216 217   else218 219     SCRIPT="$(dirname "$SCRIPT"$)/$link"220 221   fi222 223 done224 225 BIN_DIR="$(dirname "$SCRIPT")"226 227 export LEIN_JVM_OPTS="${LEIN_JVM_OPTS-"-XX:+TieredCompilation -XX:TieredStopAtLevel=1"}"228 229 # This needs to be defined before we call HTTP_CLIENT below230 231 if [ "$HTTP_CLIENT" = "" ]; then232 233   if type -p curl >/dev/null 2>&1; then234 235     if [ "$https_proxy" != "" ]; then236 237       CURL_PROXY="-x $https_proxy"238 239     fi240 241     HTTP_CLIENT="curl $CURL_PROXY -f -L -o"242 243   else244 245     HTTP_CLIENT="wget -O"246 247   fi248 249 fi250 251 # When :eval-in :classloader we need more memory252 253 grep -E -q '^\s*:eval-in\s+:classloader\s*$' project.clj 2> /dev/null && \254 255   export LEIN_JVM_OPTS="$LEIN_JVM_OPTS -Xms64m -Xmx512m"256 257 if [ -r "$BIN_DIR/../src/leiningen/version.clj" ]; then258 259   # Running from source checkout260 261   LEIN_DIR="$(dirname "$BIN_DIR")"262 263   # Need to use lein release to bootstrap the leiningen-core library (for aether)264 265   if [ ! -r "$LEIN_DIR/leiningen-core/.lein-bootstrap" ]; then266 267     echo "Leiningen is missing its dependencies."268 269     echo "Please run \"lein bootstrap\" in the leiningen-core/ directory"270 271     echo "with a stable release of Leiningen. See CONTRIBUTING.md for details."272 273     exit 1274 275   fi276 277   # If project.clj for lein or leiningen-core changes, we must recalculate278 279   LAST_PROJECT_CHECKSUM=$(cat "$LEIN_DIR/.lein-project-checksum" 2> /dev/null)280 281   PROJECT_CHECKSUM=$(sum "$LEIN_DIR/project.clj" "$LEIN_DIR/leiningen-core/project.clj")282 283   if [ "$PROJECT_CHECKSUM" != "$LAST_PROJECT_CHECKSUM" ]; then284 285     if [ -r "$LEIN_DIR/.lein-classpath" ]; then286 287       rm "$LEIN_DIR/.lein-classpath"288 289     fi290 291   fi292 293   # Use bin/lein to calculate its own classpath.294 295   if [ ! -r "$LEIN_DIR/.lein-classpath" ] && [ "$1" != "classpath" ]; then296 297     echo "Recalculating Leiningen's classpath."298 299     ORIG_PWD="$PWD"300 301     cd "$LEIN_DIR"302 303     LEIN_NO_USER_PROFILES=1 $0 classpath .lein-classpath304 305     sum "$LEIN_DIR/project.clj" "$LEIN_DIR/leiningen-core/project.clj" > \306 307       .lein-project-checksum308 309     cd "$ORIG_PWD"310 311   fi312 313   mkdir -p "$LEIN_DIR/target/classes"314 315   export LEIN_JVM_OPTS="$LEIN_JVM_OPTS -Dclojure.compile.path=$LEIN_DIR/target/classes"316 317   add_path CLASSPATH "$LEIN_DIR/leiningen-core/src/" "$LEIN_DIR/leiningen-core/resources/" \318 319     "$LEIN_DIR/test:$LEIN_DIR/target/classes" "$LEIN_DIR/src" ":$LEIN_DIR/resources"320 321   if [ -r "$LEIN_DIR/.lein-classpath" ]; then322 323     add_path CLASSPATH "$(cat "$LEIN_DIR/.lein-classpath" 2> /dev/null)"324 325   else326 327     add_path CLASSPATH "$(cat "$LEIN_DIR/leiningen-core/.lein-bootstrap" 2> /dev/null)"328 329   fi330 331 else # Not running from a checkout332 333   add_path CLASSPATH "$LEIN_JAR"334 335   BOOTCLASSPATH="-Xbootclasspath/a:$LEIN_JAR"336 337   if [ ! -r "$LEIN_JAR" -a "$1" != "self-install" ]; then338 339     self_install340 341   fi342 343 fi344 345 # TODO: explain what to do when Java is missing346 347 export JAVA_CMD="${JAVA_CMD:-"java"}"348 349 export LEIN_JAVA_CMD="${LEIN_JAVA_CMD:-$JAVA_CMD}"350 351 if [[ -z "${DRIP_INIT+x}" && "$(basename "$LEIN_JAVA_CMD")" == *drip* ]]; then352 353   export DRIP_INIT="$(printf -- '-e\n(require (quote leiningen.repl))')"354 355   export DRIP_INIT_356 357 fi358 359 # Support $JAVA_OPTS for backwards-compatibility.360 361 export JVM_OPTS="${JVM_OPTS:-"$JAVA_OPTS"}"362 363 # Handle jline issue with cygwin not propagating OSTYPE through java subprocesses: https://github.com/jline/jline2/issues/62364 365 cygterm=false366 367 if $cygwin; then368 369  case "$TERM" in370 371   rxvt* | xterm* | vt*) cygterm=true ;;372 373  esac374 375 fi376 377 if $cygterm; then378 379  LEIN_JVM_OPTS="$LEIN_JVM_OPTS -Djline.terminal=jline.UnixTerminal"380 381  stty -icanon min 1 -echo > /dev/null 2>&1382 383 fi384 385 # TODO: investigate http://skife.org/java/unix/2011/06/20/really_executable_jars.html386 387 # If you're packaging this for a package manager (.deb, homebrew, etc)388 389 # you need to remove the self-install and upgrade functionality or see lein-pkg.390 391 if [ "$1" = "self-install" ]; then392 393   if [ -r "$BIN_DIR/../src/leiningen/version.clj" ]; then394 395     echo "Running self-install from a checkout is not supported."396 397     echo "See CONTRIBUTING.md for SNAPSHOT-specific build instructions."398 399     exit 1400 401   fi402 403   echo "Manual self-install is deprecated; it will run automatically when necessary."404 405   self_install406 407 elif [ "$1" = "upgrade" ] || [ "$1" = "downgrade" ]; then408 409   if [ "$LEIN_DIR" != "" ]; then410 411     echo "The upgrade task is not meant to be run from a checkout."412 413     exit 1414 415   fi416 417   if [ $SNAPSHOT = "YES" ]; then418 419     echo "The upgrade task is only meant for stable releases."420 421     echo "See the \"Hacking\" section of the README."422 423     exit 1424 425   fi426 427   if [ ! -w "$SCRIPT" ]; then428 429     echo "You do not have permission to upgrade the installation in $SCRIPT"430 431     exit 1432 433   else434 435     TARGET_VERSION="${2:-stable}"436 437     echo "The script at $SCRIPT will be upgraded to the latest $TARGET_VERSION version."438 439     echo -n "Do you want to continue [Y/n]? "440 441     read RESP442 443     case "$RESP" in444 445       y|Y|"")446 447         echo448 449         echo "Upgrading..."450 451         TARGET="/tmp/lein-$$-upgrade"452 453         if $cygwin; then454 455           TARGET=`cygpath -w $TARGET`456 457         fi458 459         LEIN_SCRIPT_URL="https://github.com/technomancy/leiningen/raw/$TARGET_VERSION/bin/lein"460 461         $HTTP_CLIENT "$TARGET" "$LEIN_SCRIPT_URL"462 463         if [ $? == 0 ]; then464 465           cmp -s "$TARGET" "$SCRIPT"466 467           if [ $? == 0 ]; then468 469             echo "Leiningen is already up-to-date."470 471           fi472 473           mv "$TARGET" "$SCRIPT" && chmod +x "$SCRIPT"474 475           exec "$SCRIPT" version476 477         else478 479           download_failed_message "$LEIN_SCRIPT_URL"480 481         fi;;482 483       *)484 485         echo "Aborted."486 487         exit 1;;488 489     esac490 491   fi492 493 else494 495   if $cygwin; then496 497     # When running on Cygwin, use Windows-style paths for java498 499     ORIGINAL_PWD=`cygpath -w "$ORIGINAL_PWD"`500 501   fi502 503   # apply context specific CLASSPATH entries504 505   if [ -f .lein-classpath ]; then506 507     add_path CLASSPATH "$(cat .lein-classpath)"508 509   fi510 511   if [ $DEBUG ]; then512 513     echo "Leiningen's classpath: $CLASSPATH"514 515   fi516 517   if [ -r .lein-fast-trampoline ]; then518 519     export LEIN_FAST_TRAMPOLINE='y'520 521   fi522 523   if [ "$LEIN_FAST_TRAMPOLINE" != "" ] && [ -r project.clj ]; then524 525     INPUTS="$@ $(cat project.clj) $LEIN_VERSION $(test -f "$LEIN_HOME/profiles.clj" && cat "$LEIN_HOME/profiles.clj")"526 527     export INPUT_CHECKSUM=$(echo $INPUTS | shasum - | cut -f 1 -d " ")528 529     # Just don't change :target-path in project.clj, mkay?530 531     TRAMPOLINE_FILE="target/trampolines/$INPUT_CHECKSUM"532 533   else534 535     if hash mktemp 2>/dev/null; then536 537       # Check if mktemp is available before using it538 539       TRAMPOLINE_FILE="$(mktemp /tmp/lein-trampoline-XXXXXXXXXXXXX)"540 541     else542 543       TRAMPOLINE_FILE="/tmp/lein-trampoline-$$"544 545     fi546 547     trap "rm -f $TRAMPOLINE_FILE" EXIT548 549   fi550 551   if $cygwin; then552 553     TRAMPOLINE_FILE=`cygpath -w $TRAMPOLINE_FILE`554 555   fi556 557   if [ "$INPUT_CHECKSUM" != "" ] && [ -r "$TRAMPOLINE_FILE" ]; then558 559     if [ $DEBUG ]; then560 561       echo "Fast trampoline with $TRAMPOLINE_FILE."562 563     fi564 565     exec sh -c "exec $(cat $TRAMPOLINE_FILE)"566 567   else568 569     export TRAMPOLINE_FILE570 571     "$LEIN_JAVA_CMD" \572 573       "${BOOTCLASSPATH[@]}" \574 575       -Dfile.encoding=UTF-8 \576 577       -Dmaven.wagon.http.ssl.easy=false \578 579       -Dmaven.wagon.rto=10000 \580 581       $LEIN_JVM_OPTS \582 583       -Dleiningen.original.pwd="$ORIGINAL_PWD" \584 585       -Dleiningen.script="$SCRIPT" \586 587       -classpath "$CLASSPATH" \588 589       clojure.main -m leiningen.core.main "$@"590 591     EXIT_CODE=$?592 593     if $cygterm ; then594 595      stty icanon echo > /dev/null 2>&1596 597     fi598 599     ## TODO: [ -r "$TRAMPOLINE_FILE" ] may be redundant? A trampoline file600 601     ## is always generated these days.602 603     if [ -r "$TRAMPOLINE_FILE" ] && [ "$LEIN_TRAMPOLINE_WARMUP" = "" ]; then604 605       TRAMPOLINE="$(cat $TRAMPOLINE_FILE)"606 607       if [ "$INPUT_CHECKSUM" = "" ]; then608 609         rm $TRAMPOLINE_FILE610 611       fi612 613       if [ "$TRAMPOLINE" = "" ]; then614 615         exit $EXIT_CODE616 617       else618 619         exec sh -c "exec $TRAMPOLINE"620 621       fi622 623     else624 625       exit $EXIT_CODE626 627     fi628 629   fi630 631 fi