Java生成文件错误
当我试图用我创建的Makefile编译Java项目时,出现了这个错误 错误: make:没有规则生成目标Java生成文件错误,java,makefile,package,Java,Makefile,Package,当我试图用我创建的Makefile编译Java项目时,出现了这个错误 错误: make:没有规则生成目标src/edu/osu/lispinterpeter/output/*.class',这是classes'需要的。停下来* 生成文件内容: JFLAGS = -g JC = javac .SUFFIXES: .java .class .java.class: $(JC) $(JFLAGS) $*.java CLASSES = \ src/edu/osu/lispint
src/edu/osu/lispinterpeter/output/*.class',这是classes'需要的。停下来*
生成文件内容:
JFLAGS = -g
JC = javac
.SUFFIXES: .java .class
.java.class:
$(JC) $(JFLAGS) $*.java
CLASSES = \
src/edu/osu/lispinterpreter/tokenizer/*.java \
src/edu/osu/lispinterpreter/core/*.java \
src/edu/osu/lispinterpreter/output/*.java \
src/edu/osu/lispinterpreter/exceptions/*.java \
src/edu/osu/lispinterpreter/input/InputParser.java \
src/edu/osu/lispinterpreter/input/ReadInputString.java
default: classes
classes: $(CLASSES:.java=.class)
clean:
$(RM) *.class
有人能帮我拿一下Makefile吗
顺便说一句,我正在使用Eclipse。来自
如果通配符不匹配任何文件,则保持原样
似乎src/edu/osu/lispinterpeter/output是空的,因此src/edu/osu/lispinterpeter/output/*.java与任何文件都不匹配,而是保持原样,这不是预期的。使用,这是可以避免的
解决办法是替换
src/edu/osu/lispinterpreter/output/*.java
借
对于所有其他行,我认为问题在于在类
变量中使用*
。按照您编写该变量的方式,它将填充一个包含*
字符的“文件名”列表。。。它将在其余的处理过程中传播
您要么需要单独列出这些类,要么做一些事情让Make“glob”列表。如果您使用的是gnumake,那么通配符函数应该可以完成这个任务
但请注意,这在Make的其他版本上不起作用,因此您遇到了Makefile可移植性问题。(这让我回到我的评论,蚂蚁更好。)
一旦你克服了这一点,你就会遇到一个问题,如果你一次编译一个Java类:
- 您的构建将非常缓慢…'因为每个
javac
命令都会导致JVM启动(假设您使用的是Hotspot或OpenJDK工具链)
- 您必须按照正确的顺序构建类。。。根据源代码中固有的依赖关系
- 您必须将这些依赖项添加到Makefile(!!!),并且
- 如果你有依赖循环,你就有问题了李>
如果有足够的耐心,您可以构建一个Makefile来处理这个问题,但这确实很棘手,并且生成的Makefile将是脆弱的。现实的备选方案有:
- 只需在一个
javac
命令中构建所有的/.java文件,而不考虑依赖关系
- 添加一个“makedepend”规则,该规则使用某种东西来分析源代码或字节码文件,并在Makefile中生成依赖项
或者干脆用蚂蚁
参考资料:
- Java/Make依赖项生成器-
- 另一个Java生成文件生成器-
您可以单独列出所有源文件,也可以使用Makefile中的通配符
指令自动匹配这些文件
另外,从您的评论来看,java文件的包名是edu.osu.lispinterpreter.*
因此,我建议将Makefile
移动到src
目录,并在Makefile中进行这些更改
CLASSES := $(wildcard edu/osu/lispinterpreter/tokenizer/*.java)
CLASSES += $(wildcard edu/osu/lispinterpreter/core/*.java)
CLASSES += $(wildcard edu/osu/lispinterpreter/output/*.java)
CLASSES += $(wildcard edu/osu/lispinterpreter/exceptions/*.java)
CLASSES += edu/osu/lispinterpreter/input/InputParser.java
CLASSES += edu/osu/lispinterpreter/input/ReadInputString.java
java编译器应该能够从其他包中提取类的定义,只要包名与目录结构相对应,而无需在Makefile
文件夹src/edu/osu/lispinterpeter/output中写入任何显式依赖项,因为您使用的是Eclipse,您应该能够自动生成Ant“build.xml”。Ant比Make for building Java代码优越得多。但是我需要创建一个Makefile,build.xml不是一个选项@Stephen所有文件都是@uba。。。。谢谢你们两位@公平地说,并不是所有的需求都是(a)技术性的或(b)合理的。我试过了,但现在它抛出了这个错误:src/edu/osu/lispinterpeter/tokenizer/tokenizer.java:4:package edu.osu.lispinterpeter.exceptions不存在我应该按特定顺序放置它们吗?你应该在Makefile中定义依赖项,这就是Makefile
的作用:您可以在这一行之后定义它:classes:$(classes:.java=.class)
。因为这本身就是另一个依赖项规则,所以请确保添加新行
CLASSES := $(wildcard edu/osu/lispinterpreter/tokenizer/*.java)
CLASSES += $(wildcard edu/osu/lispinterpreter/core/*.java)
CLASSES += $(wildcard edu/osu/lispinterpreter/output/*.java)
CLASSES += $(wildcard edu/osu/lispinterpreter/exceptions/*.java)
CLASSES += edu/osu/lispinterpreter/input/InputParser.java
CLASSES += edu/osu/lispinterpreter/input/ReadInputString.java