Java Makefile 总是会重建,即使没有进行任何更改

标签 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

最佳答案

一般来说,make不太适合 Java。 Make 与行为类似于传统编译器的工具配合使用效果最佳:它们采用输入文件 foo.X (也许还有其他一些输入文件),它们生成一个输出文件 foo.Y 。对于 C 编译器,例如 XcYo ( foo.c 编译为 foo.o )。

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

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

在您的情况下,我敢打赌,如果您查看输出文件,javac正在为您生成A.java文件你会看到它没有生成 A.class 。因为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

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

关于Java Makefile 总是会重建,即使没有进行任何更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42936284/

相关文章:

java - Action 和名称

c - 在 makefile 中找不到隐式规则

ubuntu - 没有规则进行目标安装(Kubuntu Konsole)

makefile - 运行多个进程(多个监视命令)

java - 从 GAE 外部访问 Google 搜索 API

Java将字节数组转换为十六进制字节数组

java - Java的ReentrantLock到底是针对什么获取锁的呢?

java - 每 T 秒从 Java 运行 MATLAB

haskell - Haskell 任务的 Makefile 示例

c - 这个错误是什么意思: `somefile.c:200: error: the frame size of 1032 bytes is larger than 1024 bytes` ?