Mike K <mbk.li...@gmail.com> writes:

> All,
>
> I tried to use this script on Windows and it blew up real good!  I'm a
> Clojure, Java, and Leiningen newbie, so perhaps a kind soul can help
> me out.
>
> 1.  lein self-install "worked".  It downloaded leiningen-1.0.0-
> standalone.jar.  However, that contradicts the description at
> http://zef.me/2470/building-clojure-projects-with-leiningen which
> indicates that self-install should download several jars, including
> clojure itself.  That didn't happen, and it looks like it would never
> happen according to the python script.  Also, I'd rather use one and
> only one clojure, clojure-contrib, etc. for everything rather than
> Leiningen using its own.  Is this possible?
As you have already found out you need only standalone leiningen jar,
which is downloaded by "lein.py".


> 2.  Any other lein command seems to require the clojure jar in the
> repository ~/.m2/repository/org/clojure/clojure/1.1.0-alpha-SNAPSHOT/
> clojure-1.1.0-alpha-SNAPSHOT.jar.  Since I don't have one there, I
> modified CLOJURE_JAR to point to my existing jar.  Everything still
> fails with this sort of error:
>
> lein help
> java.lang.NoClassDefFoundError: Files
> Caused by: java.lang.ClassNotFoundException: Files
>       at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
>       at java.security.AccessController.doPrivileged(Native Method)
>       at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
>       at java.lang.ClassLoader.loadClass(ClassLoader.java:303)
>       at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
>       at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
>       at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:316)
> Could not find the main class: Files.  Program will exit.
> Exception in thread "main"
>
> I suspect the suspicious "Files" class name is coming from the fact
> that I now have CLOJURE_JAR set as follows:
>
> CLOJURE_JAR = expanduser("C:\\Program Files (x86)\\Clojure Box\\clojure
> \\clojure-1.0.0.jar")
>
> Looks like I'm getting bit by spaces in the path name.  This would not
> be an issue if lein had downloaded its own clojure jar during step 1
> (no spaces in that path).

Yes, there are some escaping problems on Windows. I changed a little bit
"lein.py" and this worked for me on Windows and Linux:

<lein.py>
#!/usr/bin/env python

import sys
from glob import glob
from os import makedirs, system, getenv
from os.path import expanduser, dirname, exists
from urllib import urlretrieve


### inits

VERSION = "1.0.0"

if sys.platform == "win32":
    CP_SEP = ";"
else:
    CP_SEP = ":"


LEIN_JAR = 
expanduser("~/.m2/repository/leiningen/leiningen/%s/leiningen-%s-standalone.jar"
 % (VERSION, VERSION))

CLOJURE_JAR = 
expanduser("~/.m2/repository/org/clojure/clojure/1.1.0-alpha-SNAPSHOT/clojure-1.1.0-alpha-SNAPSHOT.jar")

CPS = glob("lib/*")
  
LEIN_URL = "http://repo.technomancy.us/leiningen-%s-standalone.jar"; % (VERSION)


# leiningen installation checks

LEIN_BIN_DIR = dirname(sys.argv[0])

if exists(LEIN_BIN_DIR + "../src/leiningen/core.clj"):
    # running from source-checkout
    LEIN_LIBS = glob(LEIN_BIN_DIR + "/*")
    CLASSPATH = CPS + [LEIN_LIBS]
    if len(LEIN_LIBS) < 1 and sys.argv[1] != 'self-install':
        print "Your Leiningen development checkout is missing its dependencies."
        print "Please download a stable version of Leiningen to fetch the deps."
        print "See the \"Hacking\" section of the readme for details."
        exit(1)
else:
    # not running from a checkout
    CLASSPATH = CPS + [LEIN_JAR]
    if not exists(LEIN_JAR) and sys.argv[1] != 'self-install':
        print "Leiningen is not installed. Please run \"lein self-install\"."
        exit(1)

if getenv("DEBUG"):
    print CP_SEP.join(CLASSPATH)

### defs

def quote_cp(cp):
    return CP_SEP.join("\"%s\"" % p for p in cp)

def download_lein_jar():
    # TODO: wget / curl?
    print("downloading %s -> %s ..." % (LEIN_URL, LEIN_JAR)),
    sys.stdout.flush()
    LEIN_JAR_DIR = dirname(LEIN_JAR)
    if not exists(LEIN_JAR_DIR):
        makedirs(LEIN_JAR_DIR)
    # 'urlretrieve' is incrediblly slow! but it is portable anyway...
    urlretrieve(LEIN_URL, LEIN_JAR)
    print("done")

def start_repl(argv):
    # TODO: rlwrap?
    cp = ['src', 'classes'] + CLASSPATH
    CMD = 'java -cp %s clojure.main %s' % (quote_cp(cp), " ".join(argv))
    system(CMD)

def run_leiningen(argv):
    def escape_arg(s):
        return s.replace("\\", "\\\\").replace("\"", "\\\"")

    ARGS = " ".join([ '"' + escape_arg(s) + '"' for s in argv ])
    CMD = "java -Xbootclasspath/a:%s -client -cp %s clojure.main -e \"(use 
'leiningen.core) (-main \\\"%s\\\")\"" \
          % (quote_cp([CLOJURE_JAR]), quote_cp(CLASSPATH), ARGS)
    system(CMD)


### main

if __name__ == '__main__':
    if len(sys.argv) > 1 and sys.argv[1] == 'self-install':
        download_lein_jar()
    elif len(sys.argv) > 1 and sys.argv[1] == 'repl':
        start_repl(sys.argv[2:])
    else:
        run_leiningen(sys.argv[1:])

### EOF
</lein.py>

>
> 3. My clojure jar is clojure-1.0.0.jar from clojure org.  The script
> uses clojure-1.1.0-alpha-SNAPSHOT.jar, but a comment from the link
> implies that this has been supplanted by 1.1.0-master.jar.  In any
> event, I don't know where either of these two things are.  I tried
> going to build.clojure.org, but all the build artifiacts there are
> named clojure.jar.
>
> 4.  BTW, what's the deal with this ".m2" directory (i.e., where does
> the name come from)?

It comes from maven world: http://maven.apache.org/

>
> Thanks for any help you can provide!
>
>    Mike

HTH,
Rob

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to