为什么没有人使用make for Java?

2022-08-31 06:39:00

我见过的几乎每个Java项目都使用Maven或Ant。它们是很好的工具,我认为几乎任何项目都可以使用它们。但是发生了什么事?它用于各种非Java项目,可以轻松处理Java。当然,你必须下载make.exe如果你使用Windows,但Ant和Maven也没有附带JDK。

当与Java一起使用时,make是否存在一些根本性的缺陷?仅仅是因为Ant和Maven是用Java编写的吗?


答案 1

Make 和 Java 的根本问题是,Make 的工作原理是,您指定了一个依赖项,然后指定了一个规则来解决该依赖项。

使用基本的C,通常“要将main.c文件转换为main.o文件,请运行”cc main.c”。

你可以在java中做到这一点,但你很快就会学到一些东西。

主要是javac编译器启动缓慢。

区别:

javac Main.java
javac This.java
javac That.java
javac Other.java

javac Main.java This.java That.java Other.java

是黑夜和白天。

通过数百个类来加剧这种情况,它就变得站不住脚了。

然后,您将它与Java倾向于组织为目录中的文件组的事实相结合,而C和其他文件倾向于更扁平的结构。Make 没有太多直接支持使用文件层次结构。

Make也不擅长在集合级别确定哪些文件已过期。

使用Ant,它将遍历并汇总所有过时的文件,然后一次性编译它们。Make 将简单地在每个单独的文件上调用 java 编译器。让 Make 不这样做需要足够的外部工具来真正表明 Make 不能胜任这项任务。

这就是为什么像蚂蚁和Maven这样的替代品崛起的原因。


答案 2

实际上,make可以在一个命令中处理所有过时的java文件的重新编译。如果您不想编译目录中的所有文件或想要特定的顺序,请更改第一行...

JAVA_FILES:=$(wildcard *.java)
#
# the rest is independent of the directory
#
JAVA_CLASSES:=$(patsubst %.java,%.class,$(JAVA_FILES))

.PHONY: classes
LIST:=

classes: $(JAVA_CLASSES)
        if [ ! -z "$(LIST)" ] ; then \
                javac $(LIST) ; \
        fi

$(JAVA_CLASSES) : %.class : %.java
        $(eval LIST+=$$<)

推荐