【问题标题】:Shell Script for Java not workingJava的Shell脚本不起作用
【发布时间】:2016-04-26 19:13:14
【问题描述】:

我正在使用一个make文件来创建一个简单的shell脚本来执行一个Java程序,makefile如下:

top:
    javac -d classfiles -sourcepath src src/kruskal.java
test:
    echo java -classpath classfiles kruskal \$\* > kruskal
    chmod +x kruskal
clean:
    rm -f classfiles/"/".class

但是,当我运行 make test 然后尝试执行我的程序(它接受命令行参数)时,java 尝试使用参数“-classpath”和“classfiles”作为参数运行程序,导致程序抛出一个FileNotFoundException。我正在运行程序:

kruskal g1.txt 

我做错了吗?这是我第一次使用 shell 脚本,感谢任何帮助。

编辑:这也是确切的错误:

java.io.FileNotFoundException: classfiles (Access is denied)
    at java.io.FileInputStream.open0(Native Method)
    at java.io.FileInputStream.open(Unknown Source)
    at java.io.FileInputStream.<init>(Unknown Source)
    at java.util.Scanner.<init>(Unknown Source)
    at kruskal.readInputs(kruskal.java:20)
    at kruskal.main(kruskal.java:172)
Exception in thread "main" java.lang.NullPointerException
    at kruskal.BFS(kruskal.java:132)
    at kruskal.main(kruskal.java:177)

【问题讨论】:

    标签: java bash shell makefile


    【解决方案1】:

    要在 Makefile 中转义 $,请使用另一个 $kruskal 文件的当前内容实际上是java -classpath classpath kruskal ** 扩展了当前目录中的文件,即classpath 等。或者更糟糕的是,* 已经通过运行 echo 命令的 shell 进行了扩展。

    所以要使Makefile 行正确:

    test:
             echo "java -classpath classfiles kruskal \$$*" > kruskal
    

    【讨论】:

    • 谢谢!原来它确实在扩展当前目录中的文件并将它们用作参数。
    最近更新 更多