我有一个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有问题吗?路径错了什么?
答案 0 :(得分:0)
有很多事情可能会出错,但最明显的问题是makefile中目标的不正确依赖性。
首先,目标run
应该依赖Run.class
。如果您执行make run
,则make
会查看名为run
的目标。在makefile
中,此目标没有定义任何依赖项,它将执行行java ...
而不检查实际编译的类Run.class
是否存在。因此,如果从干净的情况下执行make run
,则不会编译源代码,并且java
命令将失败,因为编译的类缺失。
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
。您可能必须将包信息添加到运行命令和依赖关系表达式,但这取决于您的源代码。您的帖子中没有足够的信息来提供完整的解决方案。
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)