2010-08-22 4 views
0

Здесь ошибка:NoClassDefFoundError при запуске оболочки сценарий

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) 

Это файл server.sh:

#!/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 

Вот код NSTask:

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, @"", @"", @""); 
    } 

Когда-либо Я запускаю этот сценарий через NSTask, и я проверяю трубку ошибки, эта ошибка появляется и печатает только эхо.

Любые идеи?

ответ

0

Заменить относительные абсолютные пути в server.sh, затем запустить server.sh с полным путем (не использовать source.sh в коде NSTask, если server.sh имеет строку shebang и всегда проверять код выхода cd команда).

Вот мой server.sh файл:

#!/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 

Это работает для меня без малейшего икать.

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

Я не думаю, что аргумент $ 1 server.sh является обязательным. Если это так, сервер.sh (т. Е. Exec java -classpath ... $ 1) будет жаловаться на это. Но да, было бы неплохо узнать, какой аргумент может быть передан как $ 1 для server.sh (... чтение man 1 java ...)!

Все это, конечно же, не устраняет тупик Objective-C while loop (NSNotFound). Вы должны реализовать асинхронный механизм чтения канала stdout вместо цикла while. (См., Например, «Темы программирования приборной панели Apple» для асинхронных операций для такого подхода.)

0

Очень похоже, что рабочий каталог не тот, которого вы ожидаете. Вы определяете относительные пути в аргументе classpath. Они относятся к текущему рабочему каталогу. Вероятно, текущий рабочий каталог не знает о файле lib/aliceserver.jar. Сделайте pwd, чтобы узнать о текущем рабочем каталоге.

+0

вы можете показать пример использования pwd? – objectiveccoder001

+0

О, все ли это копипасты? Учитывая код в вопросе, я бы ожидал, что вы немного знакомы с командами оболочки. Это просто команда оболочки, например 'echo',' dirname' и т. Д. :) Вот [связанный вопрос] (http://stackoverflow.com/questions/59895/can-a-bash-script-tell-what-directory -its-in), это может помочь вам в дальнейшем. – BalusC

+0

PWN печатный/bin, я не думаю, что это правильно. Когда я добавляю «application/jarvis/brain /» (где находится основная папка ALICE), мой код зависает. Я потерялся. Не могли бы вы взглянуть на код, который я опубликовал, и посмотреть, можете ли вы что-нибудь найти? – objectiveccoder001

Смежные вопросы