2012-10-02 49 views
0

我有一個Java程序,並編寫一個makefile在Linux上編譯它。Makefile,主要功能,ClassNotFound

這樣的組織我的項目(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命令終止,異常顯示「找不到主類:運行」

我的makefile有問題嗎?錯誤的道路或什麼?

回答

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

0

最後你需要在運行時指定包,因爲你似乎沒有默認包中的主類。

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

事實證明兩點應該注意: (1)運行在包中,所以它應該是「adb.Bing_WebResults.Run.class」在生成文件。

(2)外部JAR文件應該由級聯:(例如LIB/a.jar文件:LIB/b.jar)

+0

良好的閱讀,你發現這些錯誤。儘管如此,你的makefile仍然需要更正。例如,如果您多次執行'make',您的代碼將被多次編譯,對吧? –