制作Java Makefile

时间:2015-03-21 16:20:59

标签: java makefile

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

所以我在网上看了很多例子并尝试将它们修改为我需要的,但没有任何效果。我需要一个makefile,这样我的老师就可以通过键入" make"来创建我的项目。进入终端(由于某种原因,这是项目的要求)。我的最终目标是能够键入" sim"然后是我的代码定义的必需命令。代码在eclipse中运行,但我无法在终端中使用这些命令运行它。它将生成文件,但它表示" sim:command not found"当我尝试输入" sim ....(参数)"进入终端。 我确定这是一个愚蠢的问题,但我们在学校没有学到这一点,而且我没有使用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

4 个答案:

答案 0 :(得分:5)

只要有多个课程,使用make with java就可以用锤子驱动螺丝。

使用java代码将使用包。因此,您将拥有一个复杂的目录树,它反映了您的包结构,其中包含.java源文件。写作制定了“看到'所有这些文件都很痛苦。

您应该同时在所有源文件上调用javac以获得正确的结果。因此,通常的make模式是运行一个命令将一个源文件转换为一个编译文件'效果不好。

然而,好像你现在的主要问题是你希望java生成一个可执行文件;名为' sim'的文件。不,不会以任何简单的方式发生。 java编译器生成.class文件;它们的整个树,用于源文件。您可以直接从它们运行,也可以将它们打包到JAR文件中。

为了获得一个看似简单的命令行可执行文件的东西,你需要使用一个更复杂的工具,用前面的脚本包装所有这些。

目前,你只需要这样做:

java -cp . NAME_OF_THE_CLASS_IN_sim.java

在makefile完成后运行。

答案 1 :(得分:3)

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

构建:

javac -cp .;* *.java

运行:

java -cp .;* SomeMainClass

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

答案 2 :(得分:1)

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

类似的东西:

sim: sim.class
    java sim

将完成导师所需的工作。

答案 3 :(得分:1)

如果您具有如下所示的简单目录布局,

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