我需要为Java项目创建一个makefile。
我的项目很基础。包含我的主文件和其他一些包的包。
有人可以帮我为这种项目制作一个合适的makefile吗?
答案 0 :(得分:0)
对不起,我没有经过测试,所以可能会失败...
假设你需要的是生成一个可执行的jar文件,以下内容应该可以工作,但我还没有测试过。
下面的Makefile假定您的源位于./src下,并且您乐意使用./build作为中间文件(完全被干净的目标删除,所以要小心)。
然后'make'或'make jar'应该生成jar文件。
NAME=MyProject
MAIN_CLASS=MyMainClass
SRC_DIR=./src
CLS_DIR=./build/classes
MANIFEST_FILE=./build/META-INF.MF
JAR_FILE=./$(NAME).jar
SRC_FILES=$(shell find $(SRC_DIR) -iname "*.java")
CLS_FILES=$(patsubst $(SRC_DIR)/%,$(CLS_DIR)/%,$(patsubst %.java,%.class,$(SRC_FILES)))
.PHONY: jar run clean mrproper
jar : $(JAR_FILE)
run : $(JAR_FILE)
java -jar $(JAR_FILE)
$(JAR_FILE) : $(MANIFEST_FILE) $(CLS_FILES)
jar cmf $< $@ $(CLS_DIR)
$(MANIFEST_FILE) :
mkdir -p $(dir $@)
echo Main-Class: $(MAIN_CLASS) > $@
$(CLS_DIR) :
mkdir -p $(CLS_DIR)
$(CLS_DIR)/%.class : $(SRC_DIR)/%.java $(CLS_DIR)
javac -d $(CLS_DIR) -sourcepath $(SRC_DIR) $<
clean :
rm -Rf ./build
mrproper : clean
rm -f $(JAR_FILE)
每次执行Make it执行查找操作以获取源文件列表时,这可能会导致一些延迟,具体取决于文件系统的数量和文件系统的速度....但是你说的是一个小的项目所以不应该是一个问题。
双patsubst可能会压缩成一个,但为了以防万一,我分两步完成。
另请注意,此解决方案分别编译每个Java类。这可能是非常昂贵的,并且建议另一个目标是通过创建包含所有src java文件的名称并将其传递给javac的文件来理想地一次编译。