如何通过makefile将参数从命令行传递给java程序

时间:2014-04-12 18:16:39

标签: java makefile gnu-make

我在堆栈溢出中的第一个问题......有点兴奋,但仍在努力解决这个问题。

好的,我的问题是如何通过makefile将参数从命令行传递到java程序。

老实说我真的不知道我的描述是否正确.......因为我对makefile并不是很了解...在我的作业中,描述是我们必须为GNU开发一个Makefile制作我们的计划。例如,命令行

制作

mipsim -v< test1.cmd> test1.log

将构建ISS(我们制作的模拟器),然后使用调试输出运行它,从文件test1.cmd获取输入命令并将结果写入test1.log。

我已完成该计划,但我不知道如何使上述事情发生。 到目前为止我所知道的只是使用makefile从.java文件制作.class文件.... 我不知道如何将test1.cmd作为输入文件的名称,将test1.log作为输出 命令行中的文件名....我想这两个名字可能会通过主函数中的String [] args进入我的程序......

请问有人给我一些帮助吗?

谢谢

3 个答案:

答案 0 :(得分:1)

对这些问题存在一些困惑。

首先,使用make编译Java有点...... iffy。 (大多数人使用蚂蚁或专家。)但是,如果你不介意一点开销,你可以使用make来做。您可能应该从Java包层次结构的根目录运行make。您可以使用make macros确定下面的所有Java文件。提示:shell:

JAVA_FILES = $(shell find -name \*.java)

然后你运行javac。 (确保使用make宏为编译器等定义所有路径名。)使用Java,导出make目标并不容易,因为.class文件不是1:1 w.r.t. java文件。我只是使用目标"编译",取决于所有java文件,并触摸充当虚拟目标的文件。

第二,执行。要调用不在可执行jar中的Java程序,请设置classpath(选项-cp),指定主类名并添加命​​令行参数。我必须知道" mipsim"是 - 可能是一个shell脚本来做这件事。无论如何,make目标可以是日志文件:

%.log : %.cmd
        ${JAVA_HOME}/bin/java -cp ${ROOT} <$< >$@ 

现在,make test1.cmd应该运行您的程序。

注意:程序参数不指定重定向;这是由shell处理的。

答案 1 :(得分:0)

有一堆无关的问题......

您要显示的语法: mipsim -v < test1.cmd > test1.log

会调用可执行文件mipsim。将“-v”传递给args [1]。将test1.cmd重定向为standrad输入,test1.log是标准输出。 输出重定向由操作系统发生,因此在c ++中从std :: cin读取将从文件读取并写入std :: cout将写入test1.log

在java中,这些将被重定向到System.in和System.out

关于makefile 基本上,make文件规则如下所示:

 <target>: <dependency1> .. < dependencyn>
    ~tab~  command

就像有可能构建一个调用Javac的目标一样。可以构建一个调用Java的目标..因此您可以构建一个测试目标并使用它来执行您需要的任何命令

如果你构建了一个c ++可执行文件,那么你可以用同样的方式从makefile中执行它。

test: mipsim
      mipsim -v < test1.cmd > test1.log

关于将参数值传递给make文件命令行的最后一个问题你的意思是这样的吗?  使PARA1 = 1 PARA2 = ABC.c

您可以使用makefile中的参数..

test: mipsim
      mipsim -v < $(INPUT_FILE) > $(OUTPUT_FILE)

答案 2 :(得分:0)

快速评论您的问题。

你的makefile需要2个目标。一个用于构建,另一个用于运行。

all:build run

构建:    (这是从你的java源代码构建类文件)

运行:    把你的java命令行放在这里&#34; java ...&#34;

当您运行&#34; make&#34;时,它将调用&#34; all&#34;目标。所有目标都会调用&#34; build&#34;并且&#34;运行&#34;目标,所以只需将一个东西放在一个目标中并使用这些组合。

您的java代码。

你的java是输入文件名作为参数还是从stdin? 如果你想获取输入文件名,那么你可以从传递给你的main(String [] args)的args参数中获取它。

如果你想从stdin读取,那么你可以创建一个bufferedreader,如下所示。 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

希望这有帮助。 (欢迎+1,如果你喜欢这个答案)