【问题标题】:Making a Java Makefile制作 Java Makefile
【发布时间】:2015-05-24 22:51:43
【问题描述】:

编辑:本质上,我正在尝试做与输入“javac sim.java”然后输入“java sim (commands)”相同的事情。有没有办法使用 makefile 替换它?

所以我在网上查看了很多示例并尝试将它们修改为我需要的内容,但没有任何效果。我需要一个makefile,这样我的老师就可以通过在终端中输入“make”来创建我的项目(出于某种原因,这是项目的要求)。我的最终目标是能够键入“sim”,然后键入我的代码定义的所需命令。该代码在 Eclipse 中运行,但我无法在终端中使用这些命令运行它。它会生成文件,但是当我尝试在终端中输入“sim....(参数)”时,它会显示“sim: command not found”。 我敢肯定这是一个愚蠢的问题,但我们在学校还没有学过这个,我也没有使用 Makefile 的经验。

下面是我的makefile。

JFLAGS = -g
JC = javac
OPT = -O3
#OPT = -g
WARN = -Wall

sim: sim.class

sim.class: sim.java
    $(JC) $(JFLAGS) sim.java

clean:
    $(RM) sim.class

clobber:
    $(RM) sim.class

【问题讨论】:

  • 对 Java 使用 ant。它是一个 XML 接口,非常容易学习和使用。学习曲线并没有那么大,从长远来看,它对于那些使用 Java 开发的人来说是一个很好的技能和工具。这就是人们通常为 Java 项目(至少是更大的项目)创建构建环境的方式。但它也非常适合较小的人。它可以很好地扩展,让您可以处理复杂的情况,或者构建环境变量以及在构建之前不一定知道的事情。
  • 您没有为从 sim.class 构建 sim 定义的配方。因此,make 不会这样做,并且不会创建名为 sim 的文件。
  • 该项目的一个要求是老师可以输入“make”才能使用它
  • “使用”是什么意思?运行它,还是让它坐在那里准备运行?
  • 使用它来编译它,只需输入单词“sim”即可运行

标签: java makefile


【解决方案1】:

对于没有很多文件或依赖项的简单项目,我只是使用脚本。

构建:

javac -cp .;* *.java

运行:

java -cp .;* SomeMainClass

. 替换为您的源所需的任何路径。 * 将使用默认路径上的任何 jar 或使用不同的路径,例如 lib/*

【讨论】:

    【解决方案2】:

    只要你有一个以上的课程,使用 java 的 make 就可以成为用锤子拧螺丝的练习。

    工作 Java 代码将使用包。因此,您将拥有一个反映您的包结构的复杂目录树,其中包含您的 .java 源文件。编写“查看”所有这些文件的 make 规则很痛苦。

    您应该同时对所有源文件调用 javac 以获得正确的结果。所以,通常的“运行一个命令将一个源文件转换为一个编译文件”的 make 模式并不能很好地工作。

    但是,您目前的主要问题似乎是您希望 java 生成可执行文件;一个名为“sim”的文件。不,不会以任何简单的方式发生。 java编译器生成.class文件;它们的整个树用于您的源文件。您可以直接从它们运行,也可以将它们打包到 JAR 文件中。

    要获得看似简单的命令行可执行文件的所有方式,您需要使用更复杂的工具,将所有这些都用前面的脚本包装起来。

    现在,您只需要:

    java -cp . NAME_OF_THE_CLASS_IN_sim.java
    

    在你的 makefile 完成后运行。

    【讨论】:

      【解决方案3】:

      make 通过执行其依赖项来执行配方,然后执行配方本身。因此,如果您将运行编译代码的命令添加到顶部配方中,键入“make”也将在编译后运行代码。我不敢相信有多少人不知道这一点!

      类似:

      sim: sim.class
          java sim
      

      会按照你的导师的要求去做。

      【讨论】:

      • 添加.PHONY: sim的好习惯,所以如果目录中不小心有一个名为“sim”的文件,它仍然会运行。
      【解决方案4】:

      如果你有一个像下面这样的简单目录布局,

      root/
          src/
              ExampleClass.java
              AnotherClass.java
          out/
      makefile
      

      你可以像这样创建你的makefile

      ##
      # source directory
      ##
      SRC_DIR := src
      
      ##
      # output directory
      ##
      OUT_DIR := out
      
      ##
      # sources
      ##
      SRCS := $(wildcard $(SRC_DIR)/*.java)
      
      ##
      # classes
      ## 
      CLS := $(SRCS:$(SRC_DIR)/%.java=$(OUT_DIR)/%.class)
      
      ##
      # compiler and compiler flags
      ##
      JC := javac
      JCFLAGS := -d $(OUT_DIR)/ -cp $(SRC_DIR)/
      
      ##
      # suffixes
      ##
      .SUFFIXES: .java
      
      ##
      # targets that do not produce output files
      ##
      .PHONY: all clean
      
      ##
      # default target(s)
      ##
      all: $(CLS)
      
      $(CLS): $(OUT_DIR)/%.class: $(SRC_DIR)/%.java
          $(JC) $(JCFLAGS) $<
      
      ##
      # clean up any output files
      ##
      clean:
          rm $(OUT_DIR)/*.class
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多