Makefile,main函数,ClassNotFound

时间:2012-10-02 23:12:48

标签: makefile classnotfound

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

我的项目组织如下(Run.java是主要条目)

Program - 
   Src - 
       (package)adb.Bing_WebResults
            Run.java
       (package)adb.jsonModel
            *.java
       (package)adb.models
            *.java
   bin - 

   lib - 
       gson.jar
       commons.jar

   resource -
       *.txt

这是我的makefile:

# 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终止时使用“make run”命令时,异常显示“找不到主类:运行”

我的makefile有问题吗?路径错了什么?

3 个答案:

答案 0 :(得分:0)

有很多事情可能会出错,但最明显的问题是makefile中目标的不正确依赖性。

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

defaultRun.class的依赖性也不正确,因为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。您可能必须将包信息添加到运行命令和依赖关系表达式,但这取决于您的源代码。您的帖子中没有足够的信息来提供完整的解决方案。

P.S。:如果您将此代码复制到自己的makefile,请不要忘记使用制表符替换空格。

答案 1 :(得分:0)

最后你需要在运行时指定包,因为你似乎没有默认包中的主类。

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

答案 2 :(得分:0)

事实证明应该注意两点: (1)运行在一个包中,因此它应该是makefile中的“adb.Bing_WebResults.Run.class”。

(2)外部jar文件应连接:(例如lib / a.jar:lib / b.jar)