2014-03-05 67 views
-1

有兩個問題Java導出爲Jar有錯誤

1)當將Java項目導出爲JAR文件時,應用程序如何知道程序包中的哪個類首先運行?我的應用程序特別要求userInterface.java文件在CommonDenom.java文件之前運行。

2)運行java文件時出現錯誤,提示「Java JAR文件」commonDenom.jar「無法啓動,請檢查控制檯是否有可能的消息。

我從哪裏開始弄清楚這一點?我檢查了控制檯,但在錯誤信息彈出時它似乎沒有註冊任何東西。

package commonDenom; 

import java.util.Arrays; 
import java.util.Scanner; 

import org.eclipse.swt.SWT; 
import org.eclipse.swt.events.SelectionAdapter; 
import org.eclipse.swt.events.SelectionEvent; 
import org.eclipse.swt.widgets.Button; 
import org.eclipse.swt.widgets.Display; 
import org.eclipse.swt.widgets.Shell; 
import org.eclipse.swt.widgets.Text; 


public class UserInterface { 
    Shell shell; 
    Button btnNext; 
    Button btnDone; 
    Text input; 
    Text output; 
    static int count; 
    static int[] finalNums; 
    int[] nums = new int[1000]; 

    public static void main(String[] args){ 
     Display display = new Display(); 
     new UserInterface(display); 
     display.dispose(); 
    } 

    public UserInterface(Display display){ 
     shell = new Shell(display); 
     shell.setSize(220,350); 
     shell.open(); 

     input = new Text(shell, SWT.SINGLE); 
     input.setBounds(10, 10, 100, 20); 

     btnNext = new Button(shell, SWT.PUSH); 
     btnNext.setBounds(10, 40, 100, 30); 
     btnNext.setText("Next"); 
     nextPress(); 

     btnDone = new Button(shell, SWT.PUSH); 
     btnDone.setBounds(10, 80, 100, 30); 
     btnDone.setText("Done"); 
     donePress(); 

     output = new Text(shell, SWT.SINGLE); 
     output.setBounds(10, 120, 200, 200); 

     while(!shell.isDisposed()){ 
      if(!display.readAndDispatch()){ 
       display.sleep(); 
      } 
     } 
    } 

    public void nextPress(){ 

     btnNext.addSelectionListener(new SelectionAdapter(){ 
      int x = 0; 
      @Override 
      public void widgetSelected(SelectionEvent e) { 
        nums[x] = Integer.parseInt(input.getText()); 
        System.out.println("nums[" + x + "]:" + nums[x]); 
        x++; 
        count++; 
      } 
     }); 
    } 

    public void donePress(){ 
     btnDone.addSelectionListener(new SelectionAdapter(){ 
      @Override 
      public void widgetSelected(SelectionEvent e) { 
       finalNums = new int[count]; 
       for(int i = 0; i < count; i++){ 
        finalNums[i] = nums[i]; 
       } 
       System.out.println("finalNums:" + Arrays.toString(finalNums)); 
       commonDenom.compare(); 
       if(commonDenom.getResult() == 0){ 
        output.setText(Arrays.toString(finalNums) + "\nThese numbers do not have a \ncommon multiplier"); 
       } 
       else{ 
        output.setText(Arrays.toString(finalNums) + "\nResult:" + String.valueOf(commonDenom.getResult())); 
       } 
      } 
     }); 
    } 
    public static int[] getNums(){ 
     return finalNums; 
    } 
} 

Manifest.txt位置:/升降梭箱/工作區/ commonDenom/bin中

類位置:/升降梭箱/工作區/ commonDenom/bin中/ commonDenom/

類名:

commonDenom.class 
UserInterface.class 
UserInterface$1.class (I didn't create this) 
UserInterface$2.class (I didn't create this) 

Manifest.txt內容(帶有兩個尾隨空白行):

Main-Class: commonDenom.UserInterface 

罐子TF CommonDenom.jar返回如下:

META-INF/ 
META-INF/MANIFEST.MF 
Manifest.txt 
commonDenom/ 
commonDenom/commonDenom.class 
commonDenom/UserInterface$1.class 
commonDenom/UserInterface$2.class 
commonDenom/UserInterface.class 
+0

你的意思是_My applicatino(sic)特別要求userInterface.java文件在CommonDenom.java_之前運行?只有**一個**類被運行 - 在你的'META-INF/MANIFEST.MF'中被指定爲'Main-Class'的類。有關更多信息,請參見[this](http://docs.oracle.com/javase/tutorial/deployment/jar/appman.html)。附:你發佈了**拼寫錯誤**。這表明你很少或沒有努力。如果你不能被打擾,爲什麼我們應該付出努力? –

回答

2

我建議先手動創建jar。這將是一個很好的理智測試,你會學到如何做到這一點。以下是具體步驟:

  1. 創建Manifest.txt文件的地方,比方說你的項目的根。一行就足夠了,像這樣:

    Main-Class: commonDenom.UserInterface 
    

    確保文件以換行符結束。 Eclipse在默認情況下不會在文件末尾放置換行符。尾隨空行是可以的。

  2. 轉到父目錄其中Eclipse放置您的類文件。例如,在Maven項目中,這是相對於項目根目錄的target/classes。 Ant構建可以使用bin代替。在你的榜樣,這應該是一個包含commonDenom(其中又包含構建產品:UserInterface.class)目錄

  3. 創建的jar:

    jar cfm /tmp/somename.jar /path/to/Manifest.txt commonDenom 
    # or probably: 
    jar cfm /tmp/somename.jar /path/to/Manifest.txt * 
    

    這將使你的類文件樹到罐子指定的清單文件。

現在你應該可以運行這個文件了。這可以是您的基準測試。

您可以檢查罐子用命令的內容:

jar tf /tmp/somename.jar 

應該打印出類似這樣:

META-INF/ 
META-INF/MANIFEST.MF 
commonDenom/UserInterface.class 
... # your other class files... 

現在,你有你的基準測試中,你可以嘗試創建使用Eclipse的jar。如果由Eclipse創建的jar不起作用,您可以查看其內容以查看與基準案例的不同之處,這可以幫助您調試問題。

+1

我同意 - 請按照我之前的建議手動建立罐子並告訴我們會發生什麼。 – jgitter

+0

在現在製作罐子的過程中。我把Commonifeenom中的Manifest.txt(與bin和src相同的目錄)。然後你說要導航(我假設在終端中)到具有根項目commonDenom的bin文件夾。 (請注意,該項目命名爲'commonDenom',該軟件包也被稱爲'commonDenom')。所以現在在終端我的路徑中顯示'Stuart-Kuredjians-iMac-2:bin skuredjian $'因爲'Manifest.txt'在與'bin'級別相同,我已經在'bin'中,當指定/ path/to時,如何備份一個級別? – dbconfession

+0

順便說一句..我把清單INTO斌,它的工作。但是如果我希望艙單與艙位保持在同一水平而不是艙內呢?我不知道如何指定高於我所在的級別。 – dbconfession

1

您可以在清單文件中定義應用程序的入口點。 看看這裏: http://docs.oracle.com/javase/tutorial/deployment/jar/appman.html

+0

謝謝。我閱讀了這份文件,這是我聽到的第一份清單。這是哪裏?它是一個文件嗎?打包jar文件之前,是否可以在eclipse中指定入口點?或者我必須編輯一個實際的文本文件?謝謝。 – dbconfession

+0

不要緊,我在導出嚮導中找到它。讓我試試看看它是否有效。默認情況下,我沒有指定,打包工具將哪個類指定爲入口點? – dbconfession

+0

這不起作用。我指定了正確的入口點類,但是我仍然得到「The Java JAR文件」commonDenom.jar「無法啓動。 – dbconfession