Shell脚本:运行java应用程序并通过脚本向它发送命令行参数?

时间:2012-02-06 01:55:50

标签: java shell

这是一堂课。我之前从未使用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 $@

感谢任何帮助。

2 个答案:

答案 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”后缀。