Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javacmakefile在每个';制作';_Java_Compilation_Makefile_Javac - Fatal编程技术网

javacmakefile在每个';制作';

javacmakefile在每个';制作';,java,compilation,makefile,javac,Java,Compilation,Makefile,Javac,你知道为什么这个makefile会重新编译每个.class文件吗?另外,我认为这是相关的,java文件导入了它们上面的文件。我已经尝试了4次,并浪费了数小时让它工作,而不是在我的项目的实际代码工作,所以任何帮助都将非常感谢 最近的尝试: 尝试3…: 尝试2…: 尝试1…: 为java创建定义良好的makefile是一项复杂的任务,因为a)源文件和类文件位于不同的目录中,b)这些目录是嵌套的,c)源文件和类文件之间没有一对一的映射。然后,即使是做得很好的makefile也不会获得好的性能,因为ma

你知道为什么这个makefile会重新编译每个.class文件吗?另外,我认为这是相关的,java文件导入了它们上面的文件。我已经尝试了4次,并浪费了数小时让它工作,而不是在我的项目的实际代码工作,所以任何帮助都将非常感谢

最近的尝试: 尝试3…: 尝试2…: 尝试1…:
为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}