2017-04-02 132 views
0

我的機器上有一些Java代碼,我從命令行運行。我想從此代碼創建一個可運行的.jar文件,以便我可以更輕鬆地分發我的應用程序。用Java代碼將多個文件夾轉換爲可運行的jar文件

的代碼在四個文件夾,名爲fol_afol_bfol_cfol_d。其中每個包含一個/bin子文件夾,其中包含.class文件,其中兩個文件夾(fol_afol_b)也包含一個/lib文件夾,其中包含代碼所需的一些.jar文件。

fol_d包含要運行的類Demo,它位於名爲machineLearning的包中。到類的完整路徑是

fol_d/bin/machineLearning/Demo 

我目前從命令行運行代碼如下:

$ cd fol_d/bin 
$ java -cp ".:../../fol_a/bin:../../fol_a/lib/*:../../fol_b/bin:../../fol_b/lib/*:../../fol_c/bin" machineLearning.Demo <param_1> <param_2> ... <param_5> 

其中<param_1><param_5>到在Demo給予Main方法的參數。

我想是創建一個單一的.jar文件包含所有必要通過fol_d成功執行Demo,即在fol_a代碼的代碼。然後,我希望能夠從命令行運行此.jar文件,併爲其提供參數Demo中的Main方法。就像這樣:

$ java -jar MyApplication.jar <param_1> ... <param_5> 

這可能嗎?我將如何做到這一點?我一直在努力在網上找到答案,但信息量混淆了我。

UPDATE

對!如此看來,所有我需要做的是這樣的:

  • bin目錄的內容複製到一個新的目錄myapp
  • 做出manifest.txt文件,指定主類運行,以及類路徑
  • 罐子myapp$ jar cmf manifest.txt myapp.jar -C myapp/ .
  • 執行的jar:$ java -jar myapp.jar <arg_1> <arg_2> ... <arg_n>

回答

2

是的,它是可能的。

  1. 使用「CP -R」的所有4個文件夾bin目錄複製到一個目錄...保留子目錄結構。 (如果您不知道如何安裝手冊條目,請參閱man cp

  2. 使用jar命令從統一目錄創建JAR文件。


UPDATE

當創建的JAR文件,該JAR內的路徑(即,在JAR文件索引)必須與各個類別完全合格的名稱相匹配。

如果要創建可執行JAR,Main Class屬性必須指定完全限定的類名稱。

如果您錯誤地命名了JAR文件條目,則java將找不到這些類,否則它將拒絕加載它們,因爲路徑名和類名不匹配。

這些要求適用於所有JAR,但從您的意見看來,您似乎忽略了這一點。

在您的評論中,您似乎在主類屬性中使用了錯誤的類名......除非您在fol_d.bin包中聲明該類!


更新2

這裏是說明了有關完全限定名

package foo.bar; 

public class Main { 
    ... 
} 

簡單的類名稱爲Main我的觀點的一個範例。 完全合格的 classname是foo.bar.Main。如果你把「.class」的文件,這個類轉換成JAR的路徑JAR文件的類必須是:

/foo/bar/Main.class 

包名稱(foo.bar)映射到目錄路徑中JAR文件索引;即「/ foo/bar」。

如果JAR文件中的路徑名不是那樣,那麼類加載器將不會找到它。

+0

在我嘗試之前 - 'man cp'通知我: 「cp實用程序的歷史版本有一個-r選項,該實現支持該選項;但是強烈建議不要使用它,因爲它沒有正確複製特殊文件,符號鏈接或fifo「。 我應該擔心這個嗎? – rdv

+0

改爲使用-R。 –

+0

不知道我是否正確理解你。我做的是(1)將我的四個'fol_'文件夾放入另一個文件夾('my_app'),(2)cd到包含'my_app'的文件夾中,(3)在該文件夾中創建一個文件'manifest .txt'只包含一行('Main-Class:fol_d/bin/machineLearning.Demo'),(4)執行'jar cfm my_app.jar manifest.txt my_app'。到現在爲止還挺好。但是當我嘗試用'java -jar my_app.jar'運行'my_app.jar'時,我得到'錯誤:無法找到或加載主類fol_d.bin.machineLearning.Demo'。 – rdv

相關問題