0

我有一个 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

这是我的生成文件:

# 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有问题吗?走错路还是什么?

4

3 回答 3

0

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

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

您对 on 的依赖default也不Run.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正确完成您的操作。您可能必须将包信息添加到运行命令和依赖项表达式中,但这取决于您的源代码。您的帖子没有包含足够的信息来提供完整的解决方案。

PS:如果您将此代码复制到自己的makefile.

于 2012-10-06T02:35:10.503 回答
0

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

java -classpath bin com.example.Run arg1 arg2 ...
于 2012-10-06T02:55:50.737 回答
0

原来要注意两点:(1)run是在一个包里,所以在makefile中应该是“adb.Bing_WebResults.Run.class”。

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

于 2012-10-07T22:36:42.560 回答