2013-05-28 58 views
2

我有以下目錄結構和文件:如何創建罐並執行正確

Folder 
    + 
    |--/org 
    |--Online.java 
    |--Online.class 

當我執行下面的代碼:

C:\>cd Folder 
C:\Folder>java Online http://www.google.com google.html 

我的文件執行,並給我正確的輸出按我需求。

現在,我想添加包'org'和Online.class文件在一個Jar文件中,例如E.g. Online.jar

我這樣做,通過執行以下代碼:

jar cvf Online.jar * 

現在,當我試圖執行以下代碼:

java -jar Online.jar http://www.google.com google.html 

這是我顯示錯誤:

Failed to load Main-Class manifest attribute from Online.jar 

任何人都可以幫助我嗎?我想知道這裏有什麼問題嗎?

+0

我是Java新手。任何人都可以幫我解決......在此先感謝 –

+1

.jar只是一個具有特定結構和.class文件的.zip文件。 –

+2

你需要有一個Manifest文件(谷歌它)。 – tilpner

回答

2

看看Java教程頁面: Setting an Application's Entry Point

+0

簡而言之:創建一個文件夾META-INF(大寫),其中MANIFEST.MF帶有'Manifest-Version:1.0'換行符'Main- Class:Online'。 –

+0

@popalka這份文件幫助我瞭解了很多細節。 感謝您爲我提供鏈接。 –

1

我覺得默認的清單可能需要進行修改,以包括主級...

Main-Class: Online.class 
2

這取決於你如何建立你的罐子。您將需要一個清單文件與主類名

我通常使用Ant來構建,所以我生成任務看起來是這樣的:

<target name="Build_myjar"> 
     <jar destfile="my.jar" filesetmanifest="mergewithoutmain"> 
      <manifest> 
       <attribute name="Main-Class" value="MyMainClass"/> 
       <attribute name="Class-Path" value="."/> 
      </manifest> 
      <fileset dir="bin"/> 
     </jar> 
    </target> 

通知的清單已經有了MainClass名稱,因此,這需要護理調用MainClass

+0

感謝它幫助我構建了我的ant腳本 –

1

假設你FQCN的是org.Online(這是一個有點尷尬)的結構應該是:

Folder 
    + 
    |--org 
    | + 
    | |--Online.class 
    | 
    |--META-INF 
     + 
     |--MANIFEST.MF 

即:

  • 您不必包含Online.java。
  • 將類文件Online.class放在包目錄org下。
  • 包含META-INF/MANIFEST.MF

META-INF/MANIFEST.MF的內容應該是:

Manifest-Version: 1.0 
Main-Class: org.Online 

也就是說,指定完全限定類名。

0

我通常使用命令jar -cmf MANIFEST_FILE jarfile.jar *.class並指定一個自定義Manifest文件,因爲我得到的錯誤和您一樣。

這是我用的是簡單的清單文件(src

Manifest-Version: 1.0 
Class-Path: . 
Main-Class: MainClassName 

Warning: The manifest must end with a new line or carriage return. The last line will not be parsed properly if it does not end with a new line or carriage return.

在運行時,我用java -jar jarfile.jar或只需雙擊Windows上的.jar。