Re: Using java.ext.dirs to manage the Classpath for Clojure REPLs
On Jan 4, 12:59 pm, "Stephen C. Gilardi" wrote: > 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. Symlinks! Ack! Terrible visions of asdf-install swim before my eyes! Oh, the pain! Ok, I'm done. Never mind. -S --~--~-~--~~~---~--~~ 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 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 -~--~~~~--~~--~--~---
Re: Using java.ext.dirs to manage the Classpath for Clojure REPLs
Stephen C. Gilardi wrote: > The "java.ext.dirs" System property provides a very convenient way to > set up and maintain a Classpath for Clojure REPLs. [...] > 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: java.ext.dirs has a default value that -Djava.ext.dirs overwrites, so make sure you replace whatever your platform's Java expects (like $JAVA_HOME/lib/ext). I've been bitten before trying to speak HTTPS while not having sunpkcs11.jar available. -Drew --~--~-~--~~~---~--~~ 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 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 -~--~~~~--~~--~--~---
Re: Using java.ext.dirs to manage the Classpath for Clojure REPLs
On Jan 4, 6:06 pm, lpetit wrote: > Note that since JDK 1.6, it is possible to use the * wildcard in > classpath items to embed all the jars in a directory at once. > > So with proper use of links in a "root" directory containing a bunch > of jars, it's possible to shorten the classpath to DIR/*:classes:src > This is nice to know! Ever since I started using Java (1.4), I wondered why they didn't have this feature. I have yet to read what's new in Java 6; I'm so far behind! --~--~-~--~~~---~--~~ 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 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 -~--~~~~--~~--~--~---
Re: Using java.ext.dirs to manage the Classpath for Clojure REPLs
I think this should be fine for 99% of situations, but I think it's also fair to say this is an unorthodox use of java.ext.dirs. I've never really had a firm grip on the idiomatic use of Java's extension mechanism, but I do know that they claim it is for well-established extension/optional packages. One example might be the bouncycastle crypto provider. The one thing I think you do have to be careful about is that if you put something in the extensions path, it will be loaded by the extensions classloader, and you will force everything running on that JVM process to use that particular version (you can get around this, but it's not always obvious). For most applications this shouldn't matter, but for an application that hosts other applications (eg. an application server) this can be problematic. I know from experience after 3 years of dealing with IBM WebSphere. You will probably never run into any problems, but I couldn't help but comment. Another solution you might want to look at is Apache's Common Launcher. It's not the most elegant solution in the world, but it makes it easy to add an entire directory of JARs to the classpath, and it makes it easy to have a cross-platform execution script. On Jan 4, 12:59 pm, "Stephen C. Gilardi" wrote: > 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 $@ > > smime.p7s > 3KViewDownload --~--~-~--~~~---~--~~ 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 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 -~--~~~~--~~--~--~---
Re: Using java.ext.dirs to manage the Classpath for Clojure REPLs
Note that since JDK 1.6, it is possible to use the * wildcard in classpath items to embed all the jars in a directory at once. So with proper use of links in a "root" directory containing a bunch of jars, it's possible to shorten the classpath to DIR/*:classes:src BTW, java.ext.dirs' semantics is to provide directories to the JVM for JDK extensions implementing JDK's APIs. (http://java.sun.com/javase/6/ docs/technotes/guides/extensions/spec.html) It does not seem appropriate to me to abuse java.ext.dirs to put in it each an every jar or class directory one may want to use in its application ? HTH, -- Laurent On Jan 4, 6:59 pm, "Stephen C. Gilardi" wrote: > 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 $@ > > smime.p7s > 3KViewDownload --~--~-~--~~~---~--~~ 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 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 -~--~~~~--~~--~--~---