Anrufe System () oder IPC :: Run3 -Befehle von Perl scheint keine Umgebungsvariable zu bestehen ($ env {java_home})

StackOverflow https://stackoverflow.com/questions/9319745

  •  26-10-2019
  •  | 
  •  

Frage

Ich habe mit dem Start eines Java -Prozesses von Perl zu kämpfen. Die Wurzel des Problems ist, dass dem Java -Prozess dem fehlt JAVA_HOME Umgebungsvariable verursacht a ClassNotFoundException.

Ich begann mit der Verwendung IPC::Run3 wegen seiner relativ eleganten Umleitung von Stdin/Stdout.

Annahme IPC::Run3 würde benutzen %ENV, Ich habe versucht, das Hinzufügen zu fügen $ENV{JAVA_HOME}.

Als das nicht funktionierte, versuchte ich es zu tun system(). Das hat nicht funktioniert, also habe ich es endlich zum Laufen gebracht system("JAVA_HOME=/path/to/java && /path/to/java_program");

Mein Testprogramm ist unten. Natürlich würde ich den richtigen Block für den geeigneten Aufruf kontrollieren.

#!/usr/bin/perl -w
use strict;

use IPC::Run3;

use vars qw(%Config $nutch_stdout $nutch_stderr);

%Config = (
  'nutch_binary'       => q[/home/crawl/nutch/runtime/local/bin/nutch],
  'nutch_crawl_dir'    => q[/home/crawl/nutch-crawl/crawl/crawldb/current/part-00000],
  'nutch_seed_dir'     => q[/home/crawl/urls],
  'solr_url'           => q[http://localhost:8080/solr],
);

my @nutch_command = ("$Config{nutch_binary}",
                 "crawl $Config{nutch_seed_dir}",
                 "-solr $Config{solr_url}",
                 "-d    $Config{nutch_crawl_dir}",
                 "-threads 1",
                 "-depth 1");

$ENV{JAVA_HOME}       = '/usr/lib/jvm/java-1.6.0';

while ((my $key,my $value) = each %ENV) {
    print "$key=$value\n";
}

print "Running @nutch_command\n";

# My original code. Next few lines are shown in first batch of output below.
#run3 \@nutch_command, undef, \$nutch_stdout, \$nutch_stderr;
#print "Output from Nutch:\n";
#print $nutch_stdout;
#print "Errors from Nutch:\n";
#print $nutch_stderr;

# Second try. The next line's output is the second batch of output.
#system(@nutch_command);

# Third try. Despite setting and displaying %ENV, this is the only thing I tried that worked
system("JAVA_HOME=/usr/lib/jvm/java-1.6.0 && @nutch_command");

Hier ist die Ausgabe des Ausführens des Run3:

    -bash-3.2$ ./test.pl 
    ... [snip] ...
    JAVA_HOME=/usr/lib/jvm/java-1.6.0
    ... [snip] ...
    Running /home/crawl/nutch/runtime/local/bin/nutch crawl /home/crawl/urls -solr http://localhost:8080/solr -d    /home/crawl/nutch-crawl/crawl/crawldb/current/part-00000 -threads 1 -depth 1
    Output from Nutch:
    Errors from Nutch:
    Exception in thread "main" java.lang.NoClassDefFoundError: crawl
    Caused by: java.lang.ClassNotFoundException: crawl
at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
    Could not find the main class: crawl. Program will exit.

Und die Ausgabe des ersten Systems () aufrufen:

    -bash-3.2$ ./test.pl
    ... [snip] ...
    JAVA_HOME=/usr/lib/jvm/java-1.6.0
    ... [snip] ...
    Running /home/crawl/nutch/runtime/local/bin/nutch crawl /home/crawl/urls -solr http://localhost:8080/solr -d    /home/crawl/nutch-crawl/crawl/crawldb/current/part-00000 -threads 1 -depth 1
    Exception in thread "main" java.lang.NoClassDefFoundError: crawl
    Caused by: java.lang.ClassNotFoundException: crawl
at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
    Could not find the main class: crawl. Program will exit.

Schließlich der dritte Systemaufruf- der einzige, der funktioniert hat!- mit der Umgebungsvariablen inline:

    -bash-3.2$ ./test.pl
    ... [snip] ...
    JAVA_HOME=/usr/lib/jvm/java-1.6.0
    ... [snip] ...
    Running /home/crawl/nutch/runtime/local/bin/nutch crawl /home/crawl/urls -solr http://localhost:8080/solr -d    /home/crawl/nutch-crawl/crawl/crawldb/current/part-00000 -threads 1 -depth 1
    crawl started in: crawl-20120216133832
    ... continue success stdout output

Zum Schluss zur Frage: Abgesehen davon, dass die Umgebung mit dem System () () aufgerufen werden muss, wie können Sie eine Umgebung an einem IPC :: Run3 oder einem System () () aufrufen?

(Hinweis: Die Ausgabe von %Env wird nur auf relevante Zeilen abgeschnitten ... Zeilen wie Pfad, Shell, _ usw. Nicht relevant für die weggelassene Frage)

Falls es relevant ist:

-bash-3.2$ uname -a
Linux hostname 2.6.18-238.el5xen #1 SMP Thu Jan 13 16:41:45 EST 2011 x86_64 x86_64 x86_64 GNU/Linux
-bash-3.2$ perl --version
This is perl, v5.8.8 built for x86_64-linux-thread-multi
War es hilfreich?

Lösung

Die Wurzel des Problems besteht darin, dass der Java -Prozess die Variable der java_home -Umgebungsvariable fehlt, die eine ClassNotFoundException verursacht.

ÜBERARBEITET

Das ist nicht die Wurzel des Problems. In der Tat, Java selbst erfordert nicht, dass Java_Home festgelegt wird.

Die unmittelbare Ursache des Problems ist eine der folgenden:

  • Die Wrapper setzt die nicht ein Klassenpfad Richtig für die Anwendung, die Sie ausführen möchten.

  • Der Wrapper mit dem falschen Klassennamen. Der Klassenname "Nutch" ist ungewöhnlich und misstrauisch - es gibt keinen Paketnamen.

Es ist wahrscheinlich, dass die wahre Grundursache darin besteht, dass Sie die Argumentliste falsch zusammenstellen. Jeder dieser Argumente mit einem Raum in ihnen sollte wirklich zwei Argumente sein; dh

        my @nutch_command = ("$Config{nutch_binary}",
             "crawl", "$Config{nutch_seed_dir}",
             "-solr", "$Config{solr_url}",
             "-d", "$Config{nutch_crawl_dir}",
             "-threads", "1",
             "-depth", "1");

Ich vermute, dass dies das Nutch -Wrapper -Skript verwirrt und veranlasst hat, den falschen Klassennamen (unter anderem) zu verwenden. Wenn Sie den gesamten Befehl als eine Zeichenfolge übergeben und die Shell analysieren lassen, verschwindet das Problem (natürlich).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top