Java 使文件多次运行

Java 使文件多次运行,java,makefile,Java,Makefile,我正试图用这个Makefile编译我的Java代码。然而,当我运行make时,它会多次编译代码 生成文件: .PHONY: all clean run SOURCES = \ Models/CustomException \ Models/Forest \ Models/ForestContainer \ Models/Owner \ Models/OwnerContainer \ Models/Tree SRC = $(addprefix

我正试图用这个Makefile编译我的Java代码。然而,当我运行make时,它会多次编译代码

生成文件:

.PHONY: all clean run

SOURCES = \
    Models/CustomException \
    Models/Forest \
    Models/ForestContainer \
    Models/Owner \
    Models/OwnerContainer \
    Models/Tree


SRC = $(addprefix src/, $(addsuffix .java, $(SOURCES)))
BIN = $(addprefix bin/, $(addsuffix .class, $(SOURCES)))

all: ${BIN}

clean:
    -rm -f ${BIN};

${BIN}: ${SRC}
    mkdir -p bin/Controllers;
    mkdir -p bin/Models;
    mkdir -p bin/Views;
    javac -d bin ${SRC};

run: all
    java -cp bin Program;
输出:

┌─( klim ) - ( ~/workspace/Forest-mvc )
└─> make

mkdir -p bin/Controllers;
mkdir -p bin/Models;
mkdir -p bin/Views;
javac -d bin src/Models/CustomException.java src/Models/Forest.java src/Models/ForestContainer.java src/Models/Owner.java src/Models/OwnerContainer.java src/Models/Tree.java;
mkdir -p bin/Controllers;
mkdir -p bin/Models;
mkdir -p bin/Views;
javac -d bin src/Models/CustomException.java src/Models/Forest.java src/Models/ForestContainer.java src/Models/Owner.java src/Models/OwnerContainer.java src/Models/Tree.java;
mkdir -p bin/Controllers;
mkdir -p bin/Models;
mkdir -p bin/Views;
javac -d bin src/Models/CustomException.java src/Models/Forest.java src/Models/ForestContainer.java src/Models/Owner.java src/Models/OwnerContainer.java src/Models/Tree.java;
mkdir -p bin/Controllers;
mkdir -p bin/Models;
mkdir -p bin/Views;
javac -d bin src/Models/CustomException.java src/Models/Forest.java src/Models/ForestContainer.java src/Models/Owner.java src/Models/OwnerContainer.java src/Models/Tree.java;
mkdir -p bin/Controllers;
mkdir -p bin/Models;
mkdir -p bin/Views;
javac -d bin src/Models/CustomException.java src/Models/Forest.java src/Models/ForestContainer.java src/Models/Owner.java src/Models/OwnerContainer.java src/Models/Tree.java;
mkdir -p bin/Controllers;
mkdir -p bin/Models;
mkdir -p bin/Views;
javac -d bin src/Models/CustomException.java src/Models/Forest.java src/Models/ForestContainer.java src/Models/Owner.java src/Models/OwnerContainer.java src/Models/Tree.java;
正如您所看到的,它多次运行命令,实际上是6次。随着源数量的增加/删除,它运行命令的次数增加/减少


这怎么可能呢?

只需在javac之后添加主类即可

${BIN}: ${SRC}
    javac -d bin -cp . Models/Tree.java

所有依赖于主类的类和文件夹(包)都将自动编译。make正在一次又一次地编译一些已经编译过的类。

make文件中的第一个目标,
all
,取决于6个不同的子目标。大概在运行开始时,这些都不存在,因此
make
认为需要构建这6个子目标中的每一个子目标。然而,构建这些子目标中的任何一个实际上都会按照您定义的方式构建所有6个子目标,但是
make
不知道这一点


底线是,它在做你让它做的事。对于每个目标int${BIN}make将调用${BIN}:${SRC}规则,但您在javac的命令行上为它提供所有源代码。您可能希望在javac行中将${SRC}替换为$<