2013-07-11 40 views
5

Tôi có tệp .jar và khi tôi chạy tệp từ dấu nhắc lệnh qua java -jar MyJar.jar, nó hoạt động tốt. Tuy nhiên, nhấp đúp vào nó thì không. Bấm đúp bắt đầu chương trình một cách chính xác, nhưng một cái gì đó bên trong không hoạt động.Nhấp đúp vào vs java -jar MyJar.jar

Vì mục đích cố gắng tự mình tìm ra điều gì sai: sự khác nhau giữa việc nhấp đúp vào một tệp .jar có thể chạy là gì khi chạy nó từ dòng lệnh?

+0

Kích đúp ra mắt javaw không java, xem: http://stackoverflow.com/questions/1997718/difference-between-java-exe-and-javaw-exe – morpheus05

+0

Bạn có ý gì khi "một cái gì đó bên trong không hoạt động"? –

+1

Sự khác biệt chính giữa hai là bối cảnh của vị trí thực hiện. Khi chạy từ dòng lệnh, ngữ cảnh thực thi sẽ là thư mục mà bạn đã thực hiện lệnh java từ đó. Khi nhấp đúp vào Jar, bối cảnh sẽ phụ thuộc vào hệ thống. Bạn có thể sử dụng System.out.println (tệp mới ("."). GetCanonicalPath()); để xuất ra vị trí mà chương trình đã được thực hiện trong – MadProgrammer

Trả lời

2

Trường hợp chương trình được thực thi là quan trọng và có thể thay đổi tùy thuộc vào cách chương trình được thực thi.

Bạn có thể kiểm tra điều này bằng cách sử dụng một cái gì đó giống như ...

import java.awt.EventQueue; 
import java.awt.HeadlessException; 
import java.io.File; 
import java.io.IOException; 
import javax.swing.JOptionPane; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class WhereAmI { 

    public static void main(String[] args) { 
     new WhereAmI(); 
    } 

    public WhereAmI() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException ex) { 
       } catch (InstantiationException ex) { 
       } catch (IllegalAccessException ex) { 
       } catch (UnsupportedLookAndFeelException ex) { 
       } 

       try { 
        String path = new File(".").getCanonicalPath(); 
        JOptionPane.showMessageDialog(null, "I was started in " + path); 
       } catch (IOException exp) { 
        exp.printStackTrace(); 
       } 

      } 
     }); 
    } 

} 

Ví dụ. Khi biên soạn, các Jar nằm trong /Volumes/Disk02/DevWork/personal/java/projects/wip/StackOverflow/WhereAmI/dist

Nếu tôi thay đổi thư mục đến vị trí này và chạy java -jar WhereAmI.jar nó ra

enter image description here

Nếu tôi thay đổi thư mục để /Volumes/Disk02/DevWork/personal/java/projects/wip/StackOverflow/WhereAmI và chạy java -jar dist/WhereAmI.jar nó ra

enter image description here

Ngữ cảnh thực hiện đã thay đổi. Điều tương tự sẽ xảy ra khi bạn nhấp đúp vào Jar và nó phụ thuộc vào hệ thống. Nó cũng sẽ quan trọng nếu nó là một vết cắt ngắn hoặc Jar thực tế.

Điều này có nghĩa là nếu bạn dựa vào bất kỳ tài nguyên tương đối nào, bạn phải đảm bảo rằng Jar được thực thi trong vị trí chính xác, liên quan đến tài nguyên của bạn.

Làm thế nào để đạt được điều này phụ thuộc vào hệ điều hành

0

Nhấp đúp để chạy nó dưới dạng "javaw -jar MyJar.jar"

+0

Không phải lúc nào cũng đúng, ví dụ, trên MacOS, không có lệnh javaw. Và bạn thậm chí không đề cập đến cách điều này có thể ảnh hưởng đến bối cảnh thực thi của ứng dụng, tốt nhất, điều này sẽ đưa ra một nhận xét hợp lý – MadProgrammer

+0

@MadProgrammer True. Nhưng tôi nghĩ rằng tôi đoán một số phần không được yêu cầu của câu hỏi khi giả sử nó đã được đề cập đến Windows chỉ. –

Các vấn đề liên quan