The "java.ext.dirs" System property provides a very convenient way to set up and maintain a Classpath for Clojure REPLs. The property can be set from the command line used to launch Clojure (typically within a launcher script). Its value is a list of directories whose *contents* will be the Classpath roots for Clojure.

In my case, I set the value of java.ext.dirs to a list of just one directory. That directory contains (relative) symbolic links to all the Jar files and directories I want Clojure to use as its Classpath.

As a concrete example, here's what I have in that directory:

clojure-contrib.classes   -> ../../clojure-contrib/classes
clojure-contrib.src       -> ../../clojure-contrib/src
clojure.jar               -> ../../clojure/clojure.jar
derby.jar                 -> ../javadb/lib/derby.jar
etc                       -> ../../../clj/etc
itext-2.0.6.jar           -> ../jfreechart/lib/itext-2.0.6.jar
jcommon-1.0.12.jar        -> ../jfreechart/lib/jcommon-1.0.12.jar
jfreechart-1.0.9.jar      -> ../jfreechart/lib/jfreechart-1.0.9.jar
jsr166y.jar               -> ../jsr166y/jsr166y.jar
local                     -> ../../../clj/local
miglayout-3.6-sources.jar -> ../miglayout/miglayout-3.6-sources.jar
miglayout-3.6-swing.jar   -> ../miglayout/miglayout-3.6-swing.jar

I've enclosed the bash script I'm currently using the launch Clojure. The one required environment variable is CLOJURE_DIRS which I set to the directory containing the links above. I like how simple the script is and how easy it is to manage which jars and directories are available to Clojure REPLs using this method.

--Steve

(note: using this with clojure.contrib.repl-ln requires revision 337 (of today) or later)

#!/bin/bash

# clj: Launches a Clojure REPL with command line arguments
#
# Environment variables:
#
# Required:
#
# CLOJURE_DIRS A list of paths to directories containing (either directly # or via symbolic links) the jar files and directories that # Clojure will use as its Classpath. The paths are separated
#               by File.pathSeparatorChar (: on UNIX).
#
# Optional:
#
#  CLOJURE_MAIN The Java class to launch
#               default: clojure.main
#               example: clojure.contrib.repl_ln
#
#  CLOJURE_OPTS Java options for this REPL's JVM instance
#               default:
#               example:"-Xms32M -Xmx128M -server"
#
#  CLOJURE_INIT Path to an init file to run, an @ prefix specifies a
#               classpath-relative path.
#               default:
#               example:"@init.clj"

set -o errexit
set -o nounset
#set -o xtrace

JAVA=java
OPTS=${CLOJURE_OPTS:-}
DIRS="-Djava.ext.dirs=${CLOJURE_DIRS}"
MAIN=${CLOJURE_MAIN:-clojure.main}
INIT=${CLOJURE_INIT:+--init ${CLOJURE_INIT}}
REPL=--repl

exec $JAVA $OPTS $DIRS $MAIN $INIT $REPL $@

Attachment: smime.p7s
Description: S/MIME cryptographic signature

Reply via email to