From: David N. <dn...@hd...> - 2008-12-03 17:55:49
|
Hello, I need some basic help understanding how best to manage Jython scripts that need access to lots of jar files (CLASSPATH, sys.path, registry). I'm using Debian Lenny with Jython 2.2.1 on java1.6.0_0 (installed as the standard packages). I'm using Jython to script Jasper Reports (an open-source Java reporting library), which has a lot of dependencies (it's /lib subdirectory contains 45 jar files). To get things working, I have added the full paths to all 45 jar files to my CLASSPATH environment variable (2,690 characters). It also works if I add the jar paths to the registry's python.path property and unset CLASSPATH (or jython -Dpython.path=/long/path1:/long/path2:..., although that's pretty unwieldy). My questions are: 1. Is there a less-verbose way to load so many jars? (Like a way to point to just the directory containing the jars?) 2. I had a lot of problems and confusion that went away once I started clearing out cachedir before running my scripts. For example, my CLASSPATH went subtly wrong at one point and fixing it didn't seem to help until I cleared the cachedir. What is the cachedir doing? In case it helps clarify what I'm doing, here's a brief example script: import glob from java.util import HashMap from java.io import File from net.sf.jasperreports.engine import JasperFillManager from net.sf.jasperreports.engine.data import JRXmlDataSource reports = glob.glob('*.jasper') for report in reports: f = File('report_description.xml') xmlDataSource = JRXmlDataSource(f) JasperFillManager.fillReportToFile(report, HashMap(), xmlDataSource) Thanks, --David |
From: Charlie G. <cha...@gm...> - 2008-12-06 01:53:48
|
On Wed, Dec 3, 2008 at 9:31 AM, David Niergarth <dn...@hd...> wrote: > 1. Is there a less-verbose way to load so many jars? (Like a way to > point to just the directory containing the jars?) I don't know of any ways builtin to Java to handle this; it's always been fairly painful for me as well. When a project I'm working on hits a certain jar threshold, I'll generally write a shell script that goes along with it to glob a directory and build a classpath. Maven's dependency management should help with this, but it's always been more pain than benefit for me. > 2. I had a lot of problems and confusion that went away once I > started clearing out cachedir before running my scripts. For example, my > CLASSPATH went subtly wrong at one point and fixing it didn't seem to > help until I cleared the cachedir. What is the cachedir doing? The cachedir keeps track of the packages that live in particular jar files: http://wiki.python.org/jython/PackageScanning If you're not importing java packages or * from java packages, you can just turn it off with -Dpython.cachedir.skip=true. It speeds up startup a bit to skip the scan step, and you only give up those package imports. I'm not sure what could've gone wrong with the cachedir from your description, and your example looks straightforward and free of use of the cache. Could you provide more detail? Charlie |
From: David N. <dn...@hd...> - 2008-12-08 17:54:36
|
Charlie Groves wrote: > I don't know of any ways builtin to Java to handle this; it's always > been fairly painful for me as well. When a project I'm working on > hits a certain jar threshold, I'll generally write a shell script that > goes along with it to glob a directory and build a classpath. Maven's > dependency management should help with this, but it's always been more > pain than benefit for me. Glad to know I'm not missing something obvious. >> What is the cachedir doing? > > The cachedir keeps track of the packages that live in particular jar > files: http://wiki.python.org/jython/PackageScanning If you're not > importing java packages or * from java packages, you can just turn it > off with -Dpython.cachedir.skip=true. It speeds up startup a bit to > skip the scan step, and you only give up those package imports. That's a nice, concise explanation. Thanks. > I'm not sure what could've gone wrong with the cachedir from your > description, and your example looks straightforward and free of use of > the cache. Could you provide more detail? I've run it a few ways and figured out what was happening. When I was experimenting and adding the list of jars to sys.path, I hadn't cleared my CLASSPATH env variable. Python would see the jars (courtesy of sys.path) and fill cachedir but the Java libraries would try to resolve packages using CLASSPATH, which at the time had a typo in the paths. I wasn't getting why cachedir would fill but the Java libs would still fail to find things. Now I get it! > Charlie Thanks, --David |
From: Philip J. <pj...@un...> - 2008-12-06 04:57:10
|
On Dec 3, 2008, at 9:31 AM, David Niergarth wrote: > Hello, > > I need some basic help understanding how best to manage Jython scripts > that need access to lots of jar files (CLASSPATH, sys.path, registry). > I'm using Debian Lenny with Jython 2.2.1 on java1.6.0_0 (installed as > the standard packages). > > I'm using Jython to script Jasper Reports (an open-source Java > reporting > library), which has a lot of dependencies (it's /lib subdirectory > contains 45 jar files). > > To get things working, I have added the full paths to all 45 jar files > to my CLASSPATH environment variable (2,690 characters). It also works > if I add the jar paths to the registry's python.path property and > unset > CLASSPATH (or jython -Dpython.path=/long/path1:/long/path2:..., > although > that's pretty unwieldy). If you can get away with it, lazily load the jar paths -- which'll be particularly easy when they're all in the same directory. What I mean by that is: just before you need them, have Python code to the dirty work of globbing them into sys.path (which is where the -Dpython.path paths end up). for jar in glob.glob(os.path.join(my_jasper_path, '*.jar')): sys.path.append(jar) -- Philip Jenvey |
From: David N. <dn...@hd...> - 2008-12-09 20:23:14
|
Thanks, Philip, for your suggestion. The import process now seems a lot more like boiling water than a nuclear power plant! --David Philip Jenvey wrote: > > On Dec 3, 2008, at 9:31 AM, David Niergarth wrote: > >> Hello, >> >> I need some basic help understanding how best to manage Jython scripts >> that need access to lots of jar files (CLASSPATH, sys.path, registry). >> I'm using Debian Lenny with Jython 2.2.1 on java1.6.0_0 (installed as >> the standard packages). >> >> I'm using Jython to script Jasper Reports (an open-source Java reporting >> library), which has a lot of dependencies (it's /lib subdirectory >> contains 45 jar files). >> >> To get things working, I have added the full paths to all 45 jar files >> to my CLASSPATH environment variable (2,690 characters). It also works >> if I add the jar paths to the registry's python.path property and unset >> CLASSPATH (or jython -Dpython.path=/long/path1:/long/path2:..., although >> that's pretty unwieldy). > > > If you can get away with it, lazily load the jar paths -- which'll be > particularly easy when they're all in the same directory. What I mean by > that is: just before you need them, have Python code to the dirty work > of globbing them into sys.path (which is where the -Dpython.path paths > end up). > > for jar in glob.glob(os.path.join(my_jasper_path, '*.jar')): > sys.path.append(jar) > > -- > Philip Jenvey |