我想知道如何使用makefile編譯僅包含具有更改的類(Java,Scala)。Makefile:請勿重新編譯未更新的文件(單獨的目錄)
我的.scala
位於src
目錄中。當我編譯時,輸出(.class
)轉到bin
目錄。
在一個項目中,當你有50個類時,每次編譯所有類都太長了。
你知道如何解決我的問題嗎?
我試過maven,但它似乎有同樣的問題。
我的makefile(斯卡拉):
SRC = src
SOURCES = $(shell find . -name *.scala)
S = scala
SC = scalac
TARGET = bin
CP = bin
run: compile
@echo ":: Executing..."
@$(S) -cp $(CP) -encoding utf8 App -feature
compile: $(SOURCES:.scala=.class)
%.class: %.scala
clear
@echo ":: Compiling..."
@echo "Compiling $*.scala.."
@$(SC) -sourcepath $(SRC) -cp $(CP) -d $(TARGET) -encoding utf8 $*.scala
編輯:我已經找到了解決辦法:建立比較的.java和.bin文件的日期。這是我的makefile:https://gist.github.com/Dnomyar/d01d886731ccc88d3c63
SRC = src
SOURCES = $(shell find ./src/ -name *.java)
S = java
SC = javac
TARGET = bin
CP = bin
VPATH=bin
run: compile
@echo ":: Executing..."
@$(S) -cp $(CP) App
compile: $(SOURCES:.%.java=.%.class)
%.class: %.java
clear
@echo ":: Compiling..."
@echo "Compiling $*.java.."
@if [ $(shell stat -c %Y $*.java) -lt $(shell stat -c %Y $(shell echo "$*.class" | sed 's/src/bin/g')) ]; then echo ; else $(SC) -sourcepath $(SRC) -cp $(CP) -d $(TARGET) -encoding utf-8 $*.java; fi
clean:
@rm -R bin/*
# Pour supprimer les fichier .fuse* créés par sublime text
fuse:
@rm `find -name "*fuse*"`
總之:不要使用Makefiles for Java或Scala。您將永遠無法正確處理您的依賴項:.scala可能會有多個.class。 .class可能依賴於其他的.class文件。使用Maven或SBT。 –
感謝您的回答。你知道Maren的清晰教程嗎?在Apache網站上,目前尚不清楚。他們沒有解釋如何運行一個項目。 – Dnomyar