【问题标题】:How to pass parameters from command line to a java program through makefile如何通过makefile将参数从命令行传递给java程序
【发布时间】:2014-04-12 18:16:38
【问题描述】:

我在堆栈溢出中的第一个问题......有点兴奋,但仍然在这个问题中挣扎。

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

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

制作

mipsim -v test1.log

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

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

有人可以帮帮我吗?

谢谢

【问题讨论】:

  • mipsim -v test1.log unix/windows 机器上的以下语法将使 test1.cmd 成为标准输入(键盘), test1.log 成为标准输出(系统.out) 无需设置

标签: java makefile gnu-make


【解决方案1】:

对于这些问题存在一些混淆。

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

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

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

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

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

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

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

【讨论】:

  • 对不起,关于这个问题的错误描述...... mipssim 代表 MIPS 模拟器,它可以从包含这些指令的输入文件中读取 MIPS 指令,并使用结果创建输出文件。关于我问题中的两个命令行,我的程序还必须读取 -v 才能将我的模拟器设置为调试模式,这将在屏幕上显示调试信息
【解决方案2】:

快速评论您的问题。

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

全部:构建运行

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

运行: 把你的java命令行放在这里,比如“java ...”

当你运行“make”时,它会调用“all”目标。并且所有目标都会调用“构建”和“运行”目标,因此只需将一件事放在一个目标中并使用组合。

你的 java 代码。

您的 java 是否将输入文件名作为参数或来自标准输入? 如果要获取输入文件名,则可以从传递给 main(String[] args) 的 args 参数中获取它。

如果你想从标准输入读取,那么你可以创建一个缓冲读取器,如下所示。 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

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

【讨论】:

    【解决方案3】:

    有一堆不相关的问题..

    您显示的语法: mipsim -v &lt; test1.cmd &gt; test1.log

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

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

    关于生成文件 基本上,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)
    

    【讨论】:

    • 在 Java 中,第一个参数将在 args[0] 中可用。
    • 模拟器的输入(.cmd)和输出(.log)不需要单独指定。显然它们应该具有相同的文件名,这可以由 makefile 强制执行。
    猜你喜欢
    • 2011-09-10
    • 2012-10-01
    • 1970-01-01
    • 2010-10-04
    • 2013-03-08
    • 1970-01-01
    • 2021-11-29
    • 2020-07-02
    相关资源
    最近更新 更多