Makefile,main函数,ClassNotFound

Makefile,main函数,ClassNotFound,makefile,classnotfound,Makefile,Classnotfound,我有一个Java程序,并编写了一个makefile在Linux上编译它 我的项目是这样组织的(Run.java是主要条目) 这是我的生成文件: # My project require 3 parameters from user input. default: Run.class Run.class: src/adb/Bing_WebResults/Run.java javac -sourcepath src/ -classpath lib/*.jar -d bin/ src/adb

我有一个Java程序,并编写了一个makefile在Linux上编译它

我的项目是这样组织的(Run.java是主要条目)

这是我的生成文件:

# My project require 3 parameters from user input.

default: Run.class
Run.class: src/adb/Bing_WebResults/Run.java
    javac -sourcepath src/ -classpath lib/*.jar -d bin/ src/adb/Bing_WebResults/*.java  src/adb/jsonModels/*.java src/adb/models/*.java


run:
    java -classpath bin/:lib/*.jar  Run  "$(ARG1)" "$(ARG2)" "$(ARG3)"
当我在Linux中使用“makerun”命令terminate时,异常显示“找不到主类:run”


我的makefile有什么问题吗?错误的路径还是什么?

有许多事情可能是错误的,但最明显的问题是makefile中目标的不正确依赖关系

首先,目标
run
应该依赖于
run.class
。如果执行
make run
,则
make
查看名为
run
的目标。在
makefile
中,此目标没有定义任何依赖项,它将执行行
java…
,而不检查实际编译的类
Run.class
是否存在。因此,如果在干净的情况下执行
make run
,则源代码将不会被编译,并且
java
命令将失败,因为编译的类丢失

您对
Run.class
default
依赖关系也不正确,因为
Run.class
将存在于
bin
目录中,而不是工作目录中。下面这行还提到了目标
Run.class

有几种方法可以改进makefile。请参阅下面的示例,其中添加了一些变量以避免重复表达式。不过,这种方法是风格和偏好的问题

BINDIR := bin
RUNCLASS := Run
RUNBINARY := $(BINDIR)/$(RUNCLASS).class
SRCDIR := src/adb/Bing_WebResults
RUNSRC := $(SRCDIR)/$(RUNCLASS).java

# Note: the default target below is superfluous at this moment
default: $(RUNBINARY)
$(RUNBINARY): $(RUNSRC)
        javac -sourcepath src/ -classpath lib/*.jar -d $(BINDIR) $(SRCDIR)/*.java src/adb/jsonModels/*.java src/adb/models/*.java

run: $(RUNBINARY)
        java -classpath $(BINDIR):lib/*.jar  $(RUNCLASS)  "$(ARG1)" "$(ARG2)" "$(ARG3)"
这在一个简化的、可比较的设置中对我有效——它可能也适用于您。查看您提供的代码片段,很可能需要添加其他依赖项或更改,以正确完成
makefile
。可能需要将包信息添加到run命令和依赖项表达式中,但这取决于源代码。您的帖子包含的信息不足,无法提供完整的解决方案


注意:如果您将此代码复制到自己的
makefile

中,请不要忘记用制表符替换空格。最后,您需要在运行时指定包,因为默认包中似乎没有主类

java -classpath bin com.example.Run arg1 arg2 ...

事实证明,有两点需要注意: (1) Run在一个包中,所以在makefile中应该是“adb.Bing_WebResults.Run.class”


(2) 外部jar文件应该通过以下方式连接:(例如lib/a.jar:lib/b.jar)

很好,您发现了这些错误。但是,您的makefile仍然需要更正。例如,如果您多次执行
make
,您的代码将被编译多次,对吗?
java -classpath bin com.example.Run arg1 arg2 ...