Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.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
Java生成文件错误_Java_Makefile_Package - Fatal编程技术网

Java生成文件错误

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

当我试图用我创建的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/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