javacmakefile在每个';制作';
你知道为什么这个makefile会重新编译每个.class文件吗?另外,我认为这是相关的,java文件导入了它们上面的文件。我已经尝试了4次,并浪费了数小时让它工作,而不是在我的项目的实际代码工作,所以任何帮助都将非常感谢 最近的尝试: 尝试3…: 尝试2…: 尝试1…:javacmakefile在每个';制作';,java,compilation,makefile,javac,Java,Compilation,Makefile,Javac,你知道为什么这个makefile会重新编译每个.class文件吗?另外,我认为这是相关的,java文件导入了它们上面的文件。我已经尝试了4次,并浪费了数小时让它工作,而不是在我的项目的实际代码工作,所以任何帮助都将非常感谢 最近的尝试: 尝试3…: 尝试2…: 尝试1…: 为java创建定义良好的makefile是一项复杂的任务,因为a)源文件和类文件位于不同的目录中,b)这些目录是嵌套的,c)源文件和类文件之间没有一对一的映射。然后,即使是做得很好的makefile也不会获得好的性能,因为ma
为java创建定义良好的makefile是一项复杂的任务,因为a)源文件和类文件位于不同的目录中,b)这些目录是嵌套的,c)源文件和类文件之间没有一对一的映射。然后,即使是做得很好的makefile也不会获得好的性能,因为make实用程序会生成单独的过程来编译每个java文件。另一方面,java编译器本身工作速度很快,具有嵌入式依赖性检查,并且能够在单个进程运行中编译数百个java文件。因此,make实用程序不用于编译java文件。对于中小型项目,使用java编译器并将所有源文件传递给它。对于大型项目,请使用Ant、Gradle或其他支持java的构建工具 编辑:要使用javac依赖项检查,请按以下方式运行:
javac -d ${OUTDIR} -cp ${OUTDIR} -sourcepath ${SRCDIR} ${MAIN_JAVA_FILE_NAME}
也就是说,只传递主java文件的名称、其他源文件所在的点、类文件所在的点两次:存储位置和检查存在的位置。${SRCDIR}应该根据其包结构包含java文件。问题是您不应该将“*.java”用作目标,而应该将其用作每个相关“*.class”的依赖项。否则,就像您的“尝试2”一样,当目标是一个没有依赖关系的文件时,它将不会被重建,并且将始终喊出“最新” 主要的想法是告诉make以清楚地理解依赖关系。下面是一个测试用例,它可以简化类文件的构建,对于一个小项目来说也可以(类测试将使用Ref的方法,因此它依赖于Ref.class,我们应该手动添加它)。我希望在这个问题上有更好的答案!!!但是对于大型项目,嗯,为什么不试试呢 生成文件:
OBJ=。/OBJ/
SRC=./SRC/
JARS=$(通配符lib/*.jar)
LIB=.:$(OBJ):$(shell echo'$(JARS)| sed's/jar/jar:/g')
定义制造目标
@echo+cc$<
@javac-classpath$(LIB)$<-d$(OBJ)$*
恩德夫
全部:始终。/obj/Ref.class./obj/Test.class
./obj/Ref.class:./src/Ref.java
美元(设定目标)
./obj/Test.class:./src/Test.java./obj/Ref.class
美元(设定目标)
运行:
@java-classpath$(LIB)测试
始终:
@mkdir-p$(OBJ)
Test.java:
公共类测试{
公共静态void main(字符串argv[]){
Ref Ref=新Ref();
参考run();
}
}
参考java:
公共类参考{
公开募捐{
System.out.println(“hhhh”);
}
}
我想在这里分享我的“更简单”模板(您只需要添加文件名和依赖项):
OBJ=OBJ
SRC=SRC
JARS=$(通配符lib/*.jar)
LIB=.:$(OBJ):$(shell echo'$(JARS)| sed's/jar/jar:/g')
目标:=$(通配符*/*.java)
目标:=$(patsubst%.java,%.class,$(目标))
目标:=$(notdir$(目标))
目标:=$(addprefix$(OBJ)/,$(目标))
定义构建
@echo+cc$<
@javac-classpath$(LIB)$<-d$(OBJ)$*
恩德夫
定义扩展
$(shell echo$1 | sed's/.class/.java/'| sed's/$(OBJ)/$(SRC)/')
恩德夫
全部:始终$(目标)
.第二次扩展:
$(OBJ)/Ref.class:$$(调用扩展,$$@)
$(调用生成)
$(OBJ)/Test.class:$$(调用扩展,$$@)$(OBJ)/Ref.class
$(调用生成)
运行:
@java-classpath$(LIB)测试
.骗子:永远干净
清洁:
@rm-rf$(OBJ)
始终:
@mkdir-p$(OBJ)
#########################################################################
# #
# http://ieng6.ucsd.edu/~cs131f/makenotes.html #
# #
#########################################################################
JFLAGS = -g -d
JC = javac
.SUFFIXES : .java .class
SRCDIR = simpella
OUTDIR = simpella/out
.java.class:
$(JC) $(JFLAGS) $(OUTDIR) $*.java
#########################################################################
#
# example run: javac -g -d simpella/out simpella/simpella.java
#
#########################################################################
all: Simpella.java
Util.java:
Util.java=Util.java
Converters.java:
Converters.java=Converters.class
Connection.java: Converters.java Util.java
Connection.java=Connection.class
Simpella.java: Connection.java Converters.java Util.java
Simpella.java=Simpella.class
@- echo "Done Compiling!!"
#########################################################################
clean:
$(RM) -v simpella/out/simpella/*.class
@- echo "Cleaned"
#########################################################################
# #
# http://ieng6.ucsd.edu/~cs131f/makenotes.html #
# #
#########################################################################
JFLAGS = -g -d
JC = javac
.SUFFIXES : .java .class
SRCDIR = simpella
OUTDIR = simpella/out
.java.class:
$(JC) $(JFLAGS) $*.java
#########################################################################
#CLASSES = Simpella.java Connection.java Converters.java Util.java
all: Simpella.java
#example run: javac -g -d simpella/out simpella/simpella.java
Util.java:
$(JC) $(JFLAGS) $(OUTDIR) $(SRCDIR)/Util.java
Converters.java:
$(JC) $(JFLAGS) $(OUTDIR) $(SRCDIR)/Converters.java
Connection.java:
$(JC) $(JFLAGS) $(OUTDIR) $(SRCDIR)/Connection.java
Simpella.java: Util.java Connection.java Converters.java
$(JC) $(JFLAGS) $(OUTDIR) $(SRCDIR)/Simpella.java
@- echo "Done Compiling!!"
#########################################################################
clean:
$(RM) -v simpella/out/simpella/*.class
@- echo "Cleaned"
JFLAGS = -g -d
JC = javac
.SUFFIXES: .java .class
.java.class:
$(JC) $(JFLAGS) $*.java
CLASSES = \
simpella\Util.java \
simpella\Converters.java \
simpella\Connection.java \
simpella\simpella.java
default: classes
classes: $(CLASSES:.java=.class)
@- echo "Done Compiling!!"
clean:
$(RM) *.class
javac -d ${OUTDIR} -cp ${OUTDIR} -sourcepath ${SRCDIR} ${MAIN_JAVA_FILE_NAME}