繁体   English   中英

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

[英]How to pass parameters from command line to a java program through makefile

我在堆栈溢出中的第一个问题...有点激动,但仍在问题中挣扎。

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

老实说,我真的不知道我的描述是否正确.......因为我对Makefile不太了解...在我的作业中,描述是我们必须为GNU make开发一个Makefile来构建我们的程序。 例如,命令行

使

mipsim -v <test1.cmd> test1.log

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

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

有人可以给我些帮助吗?

谢谢

关于这些问题有些困惑。

首先,使用make编译Java有点困难。 (大多数人使用ant或maven。)但是,如果您不介意过多的开销,则可以使用make来完成。 您可能应该从Java包层次结构根目录中的目录运行make。 您可以使用make宏确定以下所有Java文件。 提示:外壳:

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

然后运行javac。 (确保使用make宏定义到编译器等的所有路径名。)使用Java时,派生make目标并不容易,因为.class文件不是1:1 wrt Java文件。 我只是根据所有java文件使用目标“编译”,并触摸充当虚拟目标的文件。

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

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

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

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

有很多不相关的问题。

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

会调用可执行的mipsim。 将“ -v”传递给args [1]。 将test1.cmd重定向为标准输入,将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)

快速评论您的问题。

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

全部:构建运行

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

运行:将您的Java命令行放在此处,例如“ java ...”

当您运行“ make”时,它将调用“全部”目标。 并且所有目标都将调用“ build”和“ run”目标,因此只需将一件事放在一个目标中并使用组合即可。

您的Java代码。

您的Java是使用输入文件名作为参数还是来自stdin? 如果要获取输入文件名,则可以从传递给main(String [] args)的args参数中获取它。

如果要从stdin读取,则可以创建如下的bufferedreader。 BufferedReader br =新的BufferedReader(新的InputStreamReader(System.in));

希望能有所帮助。 (如果您喜欢此答案,请+1)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM