簡體   English   中英

Java Makefile始終會重建,即使沒有進行任何更改

[英]Java Makefile always rebuilds, even when no changes were made

我的makefile始終重建項目,即使沒有進行任何更改。

我該如何解決?

我的項目結構遵循通常的bin /,src /,Makefile模式。

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編譯器, XcYofoo.c編譯為foo.o )。

在編譯器的一次調用會生成多個輸出文件的情況下,很難使用Make,並且在輸出文件的名稱與輸入文件的名稱不直接相關的情況下使用它並不簡單(在這種情況下)您必須編寫所有顯式規則,而不是模式規則)。

對於Java編譯單個.java輸入文件可以產生多個不同.class文件和名稱.class文件不一定涉及到的名稱.java文件。

根據您的情況,如果您查看javacA.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

模式%必須相同; 如果將內容放在不同的目錄中,則它們是不相同的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM