2013-07-08 169 views
0

我的計算機上有一個腳本,它根據我輸入的命令運行其他腳本。這些任務經常完成,通常只需要少量參數(如更新git存儲庫)。這是使用bash腳本完成的,但我想添加更多的靈活性,所以我將它轉換爲Java。類沒有正確加載?

有一個單獨的文件用於'註冊'這些命令。我使用的語法如下:

name, alias1, alias2,... (one or more tabs) path.to.main.class

當鍵入的命令是搜索這個文件,找到正確的類路徑來加載。

name是它是用於輸出和用於查找適當的罐子的命令的名稱(以及罐子)。然後它使用path.to.main.class來加載該類。因爲我創建了一個抽象類extends,所以我演示並調用了一個名爲onCommandRun的方法,不言自明。

每個命令導出到一個罐子裏,雖然多數只需要一個類文件來運行。有一個命令需要三個類(儘管我可能只是將它們粘在同一個類中,但我不喜歡內部類)。

我的問題是,主類是JAR負載的罰款,但是當我使用它需要運行其他兩個實用類之一,我得到一個NoClassDefFoundError/ClassNotFoundxception

而且從我的理解,在JVM在需要時加載它需要的類,那麼爲什麼加載其他類時會遇到問題?

額外:每個「命令罐子」是在比主罐控制一切一個單獨的文件夾。另外#2:將每個命令分成它自己的jar的原因是因爲控制所有命令的主jar只會運行一個命令,所以爲什麼只有一個命令會註冊所有命令(並加載)所有命令被使用,然後程序退出?另外,我希望它是動態的。

+1

爲什麼要註冊所有命令?因爲你沒有按照自己的方式節省時間,並且動態加載很難(正如你所看到的那樣)。另外,爲什麼你會選擇Java over Bash來完成這個任務?這好像你正在重新設計Bash函數。如果你真的想這樣做,請包括一些相關的代碼。 (如何加載罐子,完整的堆棧跟蹤以及它指向的位置等) –

+0

我的回答有用嗎? – jesseplymale

回答

0

我假設你的主腳本(讀取與名稱及別名到Java全限定類名的映射文件中的一個)具有以具有類似的線路:

java -cp "/path/to/main.jar:/path/to/specificCommand.jar" com.example.MainClass 

我m猜測類路徑(如-cp所定義)目前只有您的特定命令的jar文件。但是,特定命令的jar文件不會自動加載到包含您的抽象類的主jar文件(以及其中包含的任何其他常規類)中。您需要使包含您需要的任何類的jar文件都在-cp參數中指定。

我想快速插入Groovy作爲腳本語言,使您可以完全訪問Java庫(特別是通過它的@Grab註釋)。