Frage

Hier ist der Fehler:

Exception in thread "main" java.lang.NoClassDefFoundError: org/alicebot/server/net/AliceServer
Caused by: java.lang.ClassNotFoundException: org.alicebot.server.net.AliceServer
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248)

Dies ist die server.sh-Datei:

#!/bin/sh
echo Starting Jarvis Program D.
cd "`dirname \"$0\"`"
export ALICE_HOME=.
export SERVLET_LIB=lib/servlet.jar
export ALICE_LIB=lib/aliceserver.jar
export JS_LIB=lib/js.jar

# Set SQL_LIB to the location of your database driver.
export SQL_LIB=lib/mysql_comp.jar

# These are for Jetty; you will want to change these if you are using a different http server.
export HTTP_SERVER_LIBS=lib/org.mortbay.jetty.jar

export PROGRAMD_CLASSPATH=$SERVLET_LIB:$ALICE_LIB:$JS_LIB:$SQL_LIB:$HTTP_SERVER_LIBS
exec java -classpath $PROGRAMD_CLASSPATH -Xms64m -Xmx128m org.alicebot.server.net.AliceServer $1

Hier ist der NSTask Code:

NSString *shstring = [NSString stringWithFormat:
                          @"%@ %@ %@", 
                          @"source", 
                          @"server.sh", 
                          @"| /usr/bin/sed '/Jarvis>/q'"
                          ];

NSTask *sh = [NSTask new];
    NSPipe *outputPipe = [NSPipe new];

    [sh setLaunchPath:@"/bin/sh"];
    [sh setArguments:[NSArray arrayWithObjects: @"-c", shstring, nil ]];
    [sh setCurrentDirectoryPath:@"/applications/jarvis/brain"];
    [sh setStandardInput:[NSPipe new]];
    [sh setStandardError:outputPipe];
    [sh setStandardOutput:outputPipe];
    [sh launch];

    NSMutableString *outputString = [NSMutableString string];
    while ([outputString rangeOfString:@"Jarvis>"].location == NSNotFound) {
        [outputString appendString:[[[NSString alloc] initWithData:[[outputPipe fileHandleForReading] readDataToEndOfFile] encoding:NSUTF8StringEncoding] autorelease]];
        NSRunAlertPanel(@"", outputString, @"", @"", @"");
    }

Wann immer ich dieses Skript durch NSTask laufen und ich das Fehlerrohr überprüfen, dass Fehler aufkommt und drucken nur das Echo.

Irgendwelche Ideen?

War es hilfreich?

Lösung

Ersetzen relativ mit absoluten Pfaden in server.sh, dann lief server.sh mit vollständigem Pfad (nicht Quelle server.sh in Ihrem NSTask Code, wenn server.sh die Shebang-Zeile hat und immer überprüfen, den Exit-Code des Befehls cd ).

Hier ist meine server.sh-Datei:

#!/bin/sh
# cat ~/Desktop/charliebot/server.sh

# code from: http://sourceforge.net/projects/charliebot/

# also adapt the following files if necessary:
# ~/Desktop/charliebot/console.sh
# ~/Desktop/charliebot/targeting.sh
# ~/Desktop/charliebot/tester.sh

echo Starting Alicebot Program D.
ALICE_HOME="${HOME}/Desktop/charliebot"

cd "${ALICE_HOME}" || { echo "Could not cd to: ${ALICE_HOME}"; exit 1; }

SERVLET_LIB="${ALICE_HOME}/lib/servlet.jar"
ALICE_LIB="${ALICE_HOME}/lib/aliceserver.jar"
JS_LIB="${ALICE_HOME}/lib/js.jar"

# Set SQL_LIB to the location of your database driver.
SQL_LIB="${ALICE_HOME}/lib/mysql_comp.jar"

# These are for Jetty; you will want to change these if you are using a different http server.
HTTP_SERVER_LIBS="${ALICE_HOME}/lib/org.mortbay.jetty.jar"

PROGRAMD_CLASSPATH="${SERVLET_LIB}:${ALICE_LIB}:${JS_LIB}:${SQL_LIB}:${HTTP_SERVER_LIBS}"

export ALICE_HOME SERVLET_LIB ALICE_LIB JS_LIB HTTP_SERVER_LIBS PROGRAMD_CLASSPATH

#printf "\n\n\nPROGRAMD_CLASSPATH\n%s\n\n\n"  "$PROGRAMD_CLASSPATH" | tr ':' '\n'

exec java -classpath "$PROGRAMD_CLASSPATH" -Xms64m -Xmx128m org.alicebot.server.net.AliceServer $1

Dies funktioniert für mich ohne die geringste Schluckauf.

# in Terminal.app
~/Desktop/charliebot/server.sh

Ich glaube nicht, das Argument $ 1 bis server.sh obligatorisch ist. Wenn das der Fall wäre, server.sh (d exec java -classpath ... $ 1) würde darüber beschweren. Aber ja, es wäre schön, zu wissen, welche Art von Argumente wie $ 1 bis server.sh weitergegeben werden kann (... Lese Mann 1 java ...)!

Das alles ist natürlich nicht entfernt Ihre Objective-C while-Schleife Deadlock (NSNotFound). Sie haben einen asynchronen stdout Rohrlesemechanismus statt einer while-Schleife zu implementieren. (Siehe zum Beispiel Apples „Dashboard-Programmierung Themen“ auf asynchrone Operationen für einen solchen Ansatz.)

Andere Tipps

Es viel aussehen, dass das Arbeitsverzeichnis ist nicht das, was Sie erwarten, es ist. Sie definieren relative Pfade in dem Classpath Argument. Sie sind relativ zum aktuellen Arbeitsverzeichnis. Wahrscheinlich das aktuelle Arbeitsverzeichnis nicht weiß, über eine lib/aliceserver.jar Datei. Führen Sie eine pwd über das aktuelle Arbeitsverzeichnis zu lernen.

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