即使没有进行任何更改,Java Makefile也会始终重建

时间:2017-03-21 19:17:20

标签: java makefile

我的makefile总是重建项目,即使没有进行任何更改。

我该如何解决?

我的项目结构遵循通常的bin /,src /,Makefile模式。

生成文件:

# output directory
BIN = bin/

# input directory
SRC = src/

# java compiler
JC = javac

# compile flags
JFLAGS = -d $(BIN) -cp $(SRC)

sourcefiles = $(addprefix $(SRC), \
  A.java \
  B.java \
  C.java)

classfiles = $(sourcefiles:.java=.class)

all: $(classfiles)

%.class: %.java
  $(JC) $(JFLAGS) $<

clean:
  $(RM)  $(BIN)*.class

我使用我在网上找到的例子制作了这个makefile,但我不确定我是否理解所做的一切,所以如果我也能得到解释,那就太棒了:3

1 个答案:

答案 0 :(得分:2)

通常,make不适合Java。使用与传统编译器类似的工具,可以使其工作得最好:它们采用输入文件foo.X(也可能是其他一些输入文件),并生成单个输出文件foo.Y。对于C编译器,例如XcYofoo.c编译为foo.o)。

在单个调用编译器生成多个输出文件的情况下很难使用Make,并且当输出文件的名称与之不直接相关时,使用它并不简单输入文件的名称(在这种情况下,您必须编写所有显式规则,而不是模式规则)。

对于Java编译器,单个.java输入文件可以生成多个不同的.class文件,.class文件的名称不一定与.java的名称相关联。文件。

在您的情况下,如果您查看javacA.java文件生成的输出文件,我会打赌您会看到它未生成A.class {1}}。由于A.class不存在,因此make将始终尝试重建它。

喔。也。您将文件放在不同的目录中。因此,即使您将自己限制在名称相同的情况下,也必须按照以下方式编写模式:

# ... Keep the first part as in your example

classfiles = $(patsubst $(SRC)%.java,$(BIN)%.class,$(sourcefiles))

all: $(classfiles)

$(BIN)%.class : $(SRC)%.java
        $(JC) $(JFLAGS) $<

# ... Keep the clean rule as in your example

模式%必须相同;如果你把东西放在不同的目录中,它们就不一样了。