http://www.perlmonks.org?node_id=1041102


in reply to Using XML::Saxon::XSLT2 Errors

I see this code in the source for the library (XML/Saxon/XSLT2.pm):
foreach my $path (qw( /usr/share/java/saxon9he.jar /usr/local/share/java/saxon9he.jar /usr/share/java/saxonb.jar /usr/local/share/java/saxonb.jar)) { $classpath = $path if -e $path; last if defined $classpath; }

It looks like it expects the jar file in one of those paths. If your jar file is not in any of those, go ahead and edit the source and add your path to the list. That's my guess anyway...

If I were to rewrite this, I would make it configurable via (at least) some environment variable, maybe SAXON_LIB_PATH or something...rather than just a hard coded list of paths

Replies are listed 'Best First'.
Re^2: Using XML::Saxon::XSLT2 Errors
by tobyink (Canon) on Jun 27, 2013 at 22:02 UTC

    It is already configurable. Look a few lines further down at the import method:

    sub import { my ($class, @args) = @_; shift @args if @args && exists $args[0] && defined $args[0] && $args[0] =~ + /^[\d\.\_]{1,10}$/; Inline->import(Java => 'DATA', CLASSPATH=>$classpath, @args); }

    So the CLASSPATH => $classpath can be overridden by passing arguments to import a la:

    use XML::Saxon::XSLT2 CLASSPATH => "/path/to/saxonb.jar";

    There is an example of providing arguments to the import method in the documentation (though not the CLASSPATH argument).

    However I've not played with it much. If your application contains multiple instances of "use XML::Saxon::XSLT2" it's probably only the first one that counts. To be sure, you can supply the path on the command line like:

    perl -MXML::Saxon::XSLT2=CLASSPATH,/path/to/saxonb.jar myscript.pl

    PS: patches would be appreciated for this issue (or indeed for RT#66278 which is a long running one).

    package Cow { use Moo; has name => (is => 'lazy', default => sub { 'Mooington' }) } say Cow->new->name
      Ah, I was misled by this comment in the docs:
      It expects Saxon to be installed in either '/usr/share/java/saxon9he.jar' or '/usr/local/share/java/saxon9he.jar'.

      Anyway, I'm unlikely to submit any patches since I'm not the one trying to use the library :-)

      Thanks for explaining this. But how can I install the module? The code below from Makefile.PL seems to prevent the module from installation if the jar is not in one of the preset locations.
      my %dynamic_config; do { unless (-e '/usr/share/java/saxon9he.jar' or -e '/usr/local/share/java/saxon9he.jar' or -e '/usr/share/java/saxonb.jar' or -e '/usr/local/share/java/saxonb.jar' or -e '/usr/local/share/java/classes/saxon9he.jar') { warn "Need saxon9he.jar or saxonb.jar to be installed in /usr/shar +e/java or /usr/local/share/java or /usr/local/share/java/classes."; exit 0; }

        Edit the Makefile.PL and then install it?

Re^2: Using XML::Saxon::XSLT2 Errors
by Uggles (Novice) on Jun 27, 2013 at 21:55 UTC
    Where are those paths? In my Java directory or in my Strawberry Perl one? Also, if I want it to just reference a path inside the module folder then how would I go about doing that?

      They're absolute paths. So on Windows, you'd probably want something starting with "C:\..."

      package Cow { use Moo; has name => (is => 'lazy', default => sub { 'Mooington' }) } say Cow->new->name
        Is there anyway to make it so that the path isn't absolute? Or rather, a way to tell it that the file is in the same directory as the module?