这是一堂课。我之前从未使用shell脚本,但是说明是编写一个运行我的java程序的脚本(已经设置为接受命令行参数(至少一个arg,可选的第二个))。我应该能够像这样运行它:
./script.sh arg1 arg2
但是当我这样做时,我得到以下错误(我的java主类名是A1):
Exception in thread "main" java.lang.NoClassDefFoundError: A1/class
Caused by: java.lang.ClassNotFoundException: A1.class
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)
Could not find the main class: A1.class. Program will exit.
这就是我的shell脚本现在的样子:
#!/bin/sh
java -Xmx1024m A1.class $@
感谢任何帮助。
答案 0 :(得分:3)
您需要告诉java在哪里查找您的类(使用-cp
) - 在目录中或.jar
要查找脚本所在的目录(而不是从中启动脚本的位置),您可以使用:$(dirname $0)
。
所以,例如:
#!/bin/bash
JVM=java
JVM_OPTS="-Xmx1024m"
$JVM $JVM_OPTS -cp $(dirname $0)/myapp.jar A1 "$@"
明确你想要的shell是一个好主意。另请注意转义参数所需的$@
周围的引号。
答案 1 :(得分:2)
运行java时使用classpath标志告诉虚拟机A1.class文件所在的位置。
请参阅doc
应该是这样的:
java -classpath /myfolder A1 $@
此外,运行命令时不要使用“.class”后缀。