Thread Java-Klasse mittels Perl-Skript aufrufen funktioniert nicht. (5 answers)
Opened by Clodan at 2012-03-12 16:46

murphy
 2012-03-12 18:22
#156791 #156791
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Guest Clodan
[...]
Code (perl): (dl )
system "nohup java -Xms128m -Xmx512m BaselineSnowClassifier $experimentName > $classifierOutFile"; 


Mein Problem ist nun, dass er meine Java-Klasse BaselineSnowClassifier.java nicht findet. Ich bekomme die folgende Fehlermeldung zurück:

Code: (dl )
Exception in thread "main" java.lang.NoClassDefFoundError: BaselineSnowClassifier

[...]


Eine Java-Klasse, die in einer Datei mit der Endung .java gespeichert ist, wird die Javalaufzeitumgebung niemals finden. Sollte sich der Quellcode der Klasse in besagter .java-Datei befinden, so muss sie erstmal in eine .class-Datei kompiliert werden, die die Laufzeitumgebung dann auch finden kann. Natürlich muss diese .class-Datei im Klassensuchpfad liegen, ein -classpath-Argument für den Aufruf der Javalaufzeitumgebung wäre also vermutlich sinnvoll.

Übrigens ist beim Zusammenbau von Pfaden und Shellbefehlen zu beachten, dass diese Operationen ziemlich systemspezifisch sind und dass hässliche Probleme mit Leer- und Sonderzeichen auftreten können.

Am Rande bemerkt ist es bei Java schlechter Stil, Klassen im namenlosen Paket anzulegen, genau wie es bei Perl schlechter Stil ist, ohne use strict; und use warnings; zu programmieren.

Wenn die Javaklasse im gleichen Verzeichnis wie das Perlskript liegt, willst Du wahrscheinlich etwas in der Art haben (ungetestet):
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/usr/bin/perl
use 5.012;
use warnings;

use FindBin;
use File::Spec qw(catdir catfile);

sub quoteshell {
  my ($_) = @_;
  s/'/'\\''/g;
  return "'$_'";
}

my $resultDir         = '/Users/System/Verfahren';
my $experimentName    = 'BaselineSnow';

my $classpath         = $FindBin::RealBin;
my $experimentDir     = catdir($resultDir, $experimentName);
my $classifierOutFile = catfile($experimentDir, 'out.classifier');

$classpath = quoteshell($classpath);
$experimentName = quoteshell($experimentName);
$classifierOutFile = quoteshell($classifierOutFile);

system "nohup java -Xms128m -Xmx512m -classpath $classpath BaselineSnowClassifier $experimentName > $classifierOutFile";

Last edited: 2012-03-12 18:23:43 +0100 (CET)
When C++ is your hammer, every problem looks like your thumb.

View full thread Java-Klasse mittels Perl-Skript aufrufen funktioniert nicht.