Arubeto
Anmeldungsdatum: 4. Dezember 2007
Beiträge: 384
|
Hallo, ich habe eine Frage zum Pellet-Reasoner, welcher zum Klassifizieren von OWL-Ontologien verwendet werden kann. In einem Java-Projekt möchten wir den Dig-Server von Pellet zum Klassifizieren einer durch Protege verwalteten Ontology verwenden. Derzeit starten wir den Server manuell über das pellet-dig.sh-Skript bzw. über die pellet-dig.bat unter Windows. Stattdessen soll der Server jedoch beim Programmstart automatisch gestartet werden, daher möchte ich den Dig-Server im Java-Code starten. Leider habe ich in der Pellet-API bis jetzt keine Funktion gefunden, mit der dies möglich ist, obwohl ich mir sicher bin, dass es geht. Kann mir da vielleicht jemand weiterhelfen? Vielen Dank im Voraus!
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17607
Wohnort: Berlin
|
Ohne den Pellet-Reasoner zu kennen - was steht denn in dem pellet-dig.sh-Skript?
|
Arubeto
(Themenstarter)
Anmeldungsdatum: 4. Dezember 2007
Beiträge: 384
|
In dem Script steht: #!/bin/sh
java -Xss4m -Xms30m -Xmx200m -classpath lib/pellet.jar org.mindswap.pellet.dig.PelletDIGServer "$@"
|
Arubeto
(Themenstarter)
Anmeldungsdatum: 4. Dezember 2007
Beiträge: 384
|
In der .bat steht: java -Xss4m -Xms30m -Xmx256m -classpath lib\pellet.jar org.mindswap.pellet.dig.PelletDIGServer %1 %2 %3 %4 %5 %6 %7 %8 %9
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17607
Wohnort: Berlin
|
Dann mußt Du Dein Programm auch mindestens mit den Optionen starten:
java -Xss4m -Xms30m -Xmx200m -classpath lib/pellet.jar
Im Projekt rufst an der gewünschten Stelle
PelletDIGServer.main (new String [] {}); auf, und inkludierst dazu
#import org.mindswap.pellet.dig.PelletDIGServer; Wenn Ihr dem Server Parameter mitgebt ("$@" im Skript), dann übergibst Du natürlich kein leeres Array, sondern die betreffenden Strings.
PelletDIGServer.main (new String [] {"-x", "true", "foobar", "42"});
|
Arubeto
(Themenstarter)
Anmeldungsdatum: 4. Dezember 2007
Beiträge: 384
|
Danke schonmal für die Antwort! Leider läuft der Server noch nicht bei mir... user unknown schrieb: Dann mußt Du Dein Programm auch mindestens mit den Optionen starten:
java -Xss4m -Xms30m -Xmx200m -classpath lib/pellet.jar
Das Programm wird direkt aus Eclipse gestartet. Dort sind die Speicheroptionen und die eingebundenen Bibliotheken bereits in der Projektkonfiguration gesetzt. Reicht das?
Im Projekt rufst an der gewünschten Stelle
PelletDIGServer.main (new String [] {}); auf, und inkludierst dazu
#import org.mindswap.pellet.dig.PelletDIGServer;
Import ist gesetzt und die main-Methode des PelletDIGServers gestartet.
Wenn Ihr dem Server Parameter mitgebt ("$@" im Skript), dann übergibst Du natürlich kein leeres Array, sondern die betreffenden Strings.
PelletDIGServer.main (new String [] {"-x", "true", "foobar", "42"});
Hm, ich habe den Server bis jetzt immer nur mit Doppelklick auf die .sh- bzw. auf die .bat-Datei gestartet. Irgendwelche Parameter habe ich eigentlich nie explizit mitübergeben. Aber ich bin mir gar nicht sicher, was z.B. diese %1...%9 in der .bat-Datei sind. Sind das 9 optionale Parameter? Oder 9 benötigte Parameter?
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17607
Wohnort: Berlin
|
Wenn jmd. die bat-Datei startet, von der Kommandozeile z.B., und zwar so:
pellet-dig foo bar -x true 42
Dann steht in %1 foo, %2 bar, %3 -x, %4 true, und %5 42. %6-9 sind leer. Analog sieht es unter Linux aus, aber "$@" beschränkt die Parameterzahl wohl nicht auf 9. Mit der Maus klicken erzeugt keine Parameter aus dem nichts, sondern dann gibt es eben keine, oder für die main-Methode ein leeres Array.
public static void main (String args[])
{
int klen = 5;
if (args.length == 1)
{
klen = Integer.parseInt (args[0]);
}
new Euler028 (klen);
}
Die main-Methode ist ja immer so gestrickt, daß sie beliebig viele Strings (enumerierbar viele, INTEGER_MAX_VALUE+1) adressieren kann. Oben wäre ein Beispiel, das nur einen Parameter auswertet. Wenn stattdessen 5 kommen werden die 4 einfach ignoriert. Ich glaube Win/Cmd.exe kann nur 9, deswegen sieht die Startdatei aus wie ein stures -wird-schon-irgendwie-passen-Vorgehen, überraschen würde es mich nicht, wenn das Programm nicht einen einzigen auswertet. Mit der Maus kannst Du Parameter übergeben, in dem Du Dateien auf die bat-Datei oder die sh-Datei ziehst - Jeder Dateiname wird zu einem Parameter, ob die Reihenfolge definiert ist weiß ich nicht.
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17607
Wohnort: Berlin
|
Die Speicheroptionen: Du mußt da natürlich addieren, was der Server braucht, plus was das andere Programm braucht.
Leider läuft der Server noch nicht bei mir...
Gibt es denn eine Fehlermeldung? Welche? Oder Compilefehler?
|
Arubeto
(Themenstarter)
Anmeldungsdatum: 4. Dezember 2007
Beiträge: 384
|
Es kommt keine Fehlermeldung. Es kommt gar keine Meldung. Aber wenn der Server dann angesprochen werden soll, passiert nichts.
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17607
Wohnort: Berlin
|
Würde der Server denn eine Meldung ausgeben? Kann man testweise mal eine eingeben "xyDaemon gestartet...". Oder mit nmap prüfen, ob an dem Port was lauscht? Damit das Starterprogramm weiterläuft würde man die andere main-Methode übrigens aus einem eigenen Thread aufrufen.
|
Arubeto
(Themenstarter)
Anmeldungsdatum: 4. Dezember 2007
Beiträge: 384
|
Der Server selber gibt keine Meldung aus, wenn er verbunden ist. Aber der Reasoner, den wir mit dem Server verbinden wollen, meldet, wenn er sich erfolgreich verbunden hat. Das ist immer der Fall, wenn wir ihn über die Skripte starten. Aber ich habe noch gar nicht daran gedacht, den Pellet-Server in einen eigenen Thread zu packen. Vielleicht bewirkt das ja was. Danke für den Hinweis.
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17607
Wohnort: Berlin
|
Nein, das bewirkt in Bezug auf den Fehler nix. Programm A startet Server B. Ohne Thread wartet A jetzt darauf, daß B beendet wird. B aber tut das, was es täte, wenn es im Thread liefe, aber dann könnte A weiterlaufen. Verschluckt denn der Server B Fehlermeldungen? Loggt der das irgendwo hin? Muß der nicht mit sudo gestartet werden? Auf welchem Port lauscht der denn - ich glaube von 1-1000 braucht man sudo-Rechte. Aber da sollte es natürlich eine Fehlermeldung geben. Im Debugger starten ist auch so ein Trick.
|
Arubeto
(Themenstarter)
Anmeldungsdatum: 4. Dezember 2007
Beiträge: 384
|
Ich glaube, der Server wird gar nicht gestartet, und daher gibt es auch keine Fehlermeldungen. Wahrscheinlich ist mein Aufruf immer noch nicht korrekt.
Ich habe jetzt testweise eine kleine Klasse geschrieben, die den Server in einem eigenen Thread starten soll und von der am Anfang des aufrufenden Programmes eine Instanz erzeugt wird. Die Klasse sieht folgendermaßen aus: public class PelletDigServerThread implements Runnable{
PelletDigServerThread(){
new Thread( this ).start();
}
public void run(){
System.out.println(" Trying to start pellet dig server...");
try{
PelletDIGServer.main(new String[] {});
}
catch(Exception e){
e.printStackTrace();
}
}
}
Im Hauptprogramm lege ich nun eine Variable vom Typ PelletDigServerThread an, bevor der restliche Programm-Code ausgeführt wird. Nun bekomme ich jedoch eine "ClassNotFoundException" in der Zeile PelletDigServer.main(new String[] {}). Liegt das daran, dass ich den Quellcode des Dig-Servers nicht habe, sondern nur die .jar-Datei?
|
Arubeto
(Themenstarter)
Anmeldungsdatum: 4. Dezember 2007
Beiträge: 384
|
Die Exception tritt auch auf, wenn ich den Start des Servers nicht in einen anderen Thread auslagere. Hier der StackTrace: Exception in thread "main" java.lang.NoClassDefFoundError: org/mortbay/http/HttpHandler
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$000(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
at owl.SupportFunctions.startPelletDigServer(SupportFunctions.java:420)
Caused by: java.lang.ClassNotFoundException: org.mortbay.http.HttpHandler
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
... 18 more
|
Arubeto
(Themenstarter)
Anmeldungsdatum: 4. Dezember 2007
Beiträge: 384
|
Ok, der Fehler lag daran, dass ich ein paar benörtigte .jars nicht eingebunden habe. Das funktioniert jetzt, aber ich habe das Problem, dass ich den Server nicht mehr stoppen kann. Dieser benutzt anscheinend einen Java-Server-Socket, womit ich mich gar nicht auskenne. Allerdings gibt es jetzt immer einen Fehler, wenn das Programm gestoppt und neu gestartet wird, weil der festgelegte Port des Servers dann schon in Benutzung ist. Wie kann ich mir unter Java die Sockets, die auf einem bestimmten Port hören, zurückgeben lassen, um diese dann zu schließen?
|