2012-09-01 166 views
4

我使用Netbeans構建了一個jar文件,它在我的系統中運行良好。但是我想讓jar能夠在所有系統中運行的文件,它們具有JRE,並且即使在該系統中未設置classpath也應該正常工作。創建一個獨立的jar文件

package circle; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import javax.swing.BorderFactory; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 


public class Circle { 


    public static void main(String[] args) { 


     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       new Circle().createAndShowGUI(); 
      } 
     }); 
    } 

    private void createAndShowGUI() { 
     JFrame f = new JFrame("Swing Paint Demo"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(new MyPanel()); 
     f.pack(); 
     f.setVisible(true); 

    } 

    class MyPanel extends JPanel { 

     public MyPanel() { 

     setBorder(BorderFactory.createLineBorder(Color.black)); 

     addMouseListener(new MouseAdapter() { 
      public void mousePressed(MouseEvent e) { 
       startX=e.getX(); 
       startY=e.getY(); 
      } 
     }); 

     addMouseMotionListener(new MouseAdapter() { 
      public void mouseDragged(MouseEvent e) { 
       X=e.getX(); 
       Y=e.getY(); 
       repaint(); 
      } 
     }); 

    } 



     public Dimension getPreferredSize() { 
     return new Dimension(250,200); 
    } 

    protected void paintComponent(Graphics g) { 
     super.paintComponent(g);  
     //g.setColor(Color.RED); 
     //g.fillRect(squareX,squareY,squareW,squareH); 
     g.setColor(Color.BLACK); 
     g.drawOval(startX,startY,X-startX,Y-startY); 
     g.fillOval(startX,startY,X-startX,Y-startY); 
    } 


    } 

     private int startX,startY,X,Y; 
} 
+4

你測試的其他JAR文件系統?你確定它不適用於這些嗎? –

+0

@Jeffrey:感謝編輯Kalyan的帖子。對於本網站的許多志願者來說,英語不是他們的第一語言,甚至是第二語言。試圖找出原始海報想要或要求的內容已經夠難了,他們應該努力避免使用非標準縮寫來避免變得更加困難。 –

+2

確保將「主程序」參數添加到MANIFEST.MF – Chris

回答

1

只要你可以通過執行以下命令創建一個JAR文件:

jar -c excel.jar MANIFEST.MF *.class 

的MANIFEST.MF文件應包含以下行:

Main-Class: createExcel 

但考慮下面的提示太:

有幾種方法:

  1. 創建一個jar文件,並把你的類(沒有依賴關係)在那裏。使用一些工具(任何IDE都有它)來執行此操作並指定具有主函數的類。您也可以通過命令行手動執行此操作。當用戶想要運行它時,他應該指定classpath,並且所有的依賴關係應該在該類路徑中。

  2. 創建相同的jar並創建.bat或.sh文件,其中設置classpath並運行您的jar。

  3. 用一些特殊工具創建跨平臺安裝程序(但好的工具不是免費的)。

記住,Netbeans的可以幫助你很多;)

+0

*「好工具不是免費的」* Aah ..這次我從另一個方向來看'JWS不好'。 ;) –

+0

Netbeans是開源的,也是一個很棒的工具,而且GetDown也是開源的,也是一個很棒的工具;) – Heidarzadeh

+0

[''javax/jnlp/ServiceManager.java'](http://jdk-source-code.googlecode。 COM/SVN /主幹/ jdk6u21_src /部署/ src目錄/ javaws的/股/班/使用javax/JNLP/ServiceManager.java)。不斷拋出這些愚蠢的理由,使用「好/更好」等有價值的術語,我將需要對答案進行連續投票。請節省我的努力。如果你想指出'特徵X是由工具A提供的而不是B'去做的,但是忽略了價值判斷。 *然後我們可以討論JWS提供的東西,在任何**第三方工具中都不會找到* –

2

您可以使用ant腳本構建運行的JAR。

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<project default="create_run_jar" name="Create Runnable Jar for Project SimpleApp with libraries in sub-folder"> 
    <!--ANT 1.7 is required --> 
    <target name="create_run_jar"> 
     <jar destfile="C:/Workspaces/SimpleApp/SimpleApp.jar"> 
      <manifest> 
       <attribute name="Main-Class" value="SimpleApp"/> 
       <attribute name="Class-Path" value=". SimpleApp_lib/lib1.jar SimpleApp_lib/lib2.jar"/> 
      </manifest> 
      <fileset dir="C:/Workspaces/SimpleApp/bin"/> 
     </jar> 
     <delete dir="C:/Workspaces/SimpleApp/SimpleApp_lib"/> 
     <mkdir dir="C:/Workspaces/SimpleApp/SimpleApp_lib"/> 
     <copy file="C:/path/to/lib/lib1.jar" todir="C:/Workspaces/SimpleApp/SimpleApp_lib"/> 
     <copy file="C:/path/to/lib/lib2.jar" todir="C:/Workspaces/SimpleApp/SimpleApp_lib"/> 
    </target> 
</project> 

在本例中,該項目的SimpleApp取決於兩個庫:lib1.jarlib2.jar,其被輸出到bin與具有指定的屬性的MANIFEST.MF

+0

+1嵌套'清單「特別方便。 – trashgod

+0

謝謝我會檢查出來! –

2

下面張貼瞭如何創建一個executable jar使用ANT的簡要說明:

此公告解釋瞭如何manifestclasspath任務可以與創建類路徑清單項輔助(使可執行罐的構建更健壯並且更少出錯):

最後一個更爲複雜的例子展示瞭如何使用的ivy來管理你的項目的第三方的依賴創造一個可執行的JAR時:

+0

謝謝Mark O'Connor !!!! –