[英]NoClassDefFoundError when running shell script
這是錯誤:
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運行此腳本並檢查錯誤管道時,就會出現該錯誤並僅打印回顯。
有任何想法嗎?
看起來工作目錄不是您期望的那樣。 您正在classpath參數中定義相對路徑。 它們是相對於當前工作目錄的。 當前工作目錄可能不知道lib/aliceserver.jar
文件。 執行pwd
了解當前的工作目錄。
用server.sh中的絕對路徑替換相對,然后使用完整路徑運行server.sh(如果server.sh有shebang行,請不要在NSTask代碼中提供server.sh,並始終檢查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
這對我有效,絲毫沒有打h。
# in Terminal.app
~/Desktop/charliebot/server.sh
我認為server.sh的參數$ 1不是必須的。 如果真是這樣,server.sh(即exec java -classpath ... $ 1)會抱怨它。 但是,是的,很高興知道可以將哪種參數作為$ 1傳遞給server.sh(...正在讀取man 1 java ...)!
當然,所有這一切都不會在循環死鎖(NSNotFound)時刪除Objective-C。 您必須實現異步stdout管道讀取機制,而不是while循環。 (例如,有關這種操作,請參見Apple的有關異步操作的“儀表板編程主題”。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.