JAR在通过终端运行时启动,但双击时不会启动

时间:2013-04-07 21:36:52

标签: java file jar

所以我尝试使用jar加载文件。该文件位于jar的外部,但位于同一文件夹中。当我使用java -jar Test.jar运行jar终端时,它运行得很好,但是如果我通过双击jar来运行它,它就不会正确从文件中加载。我可以用任何一种方法加载外部图像,但不是我创建的文件。这是在Mac OSX上运行的。这个问题似乎也存在于Ubuntu上。但是,在Windows上,文件的加载更加错误。

从两个案例中加载的路径似乎相同。从终端运行时,数字的输出是正确的。但是,通过双击运行时,任何超过127的数字都会被不正确地加载。我已经研究了几个小时的解决方案,但没有用。

编辑:这是我的清单

Main-Class: Test

我创建了这个简单的应用程序来演示我的问题。

这是写入将要读取的文件的内容。

import java.io.*;

public class TestWriter{
public static void main(String[] args){
    try{
        // Create the file and FileWriter.
        FileWriter out = new FileWriter(new File("test.map"));

        // Write some test numbers.
        for (int i = 0; i < 481; i += 30)
            out.write(i);

        // Flush the output (for good measure?)
        out.flush();

        // Close the output.
        out.close();
    } catch (IOException e){
        e.printStackTrace();
    }
}
}

这是加载文件的内容。

import javax.swing.JComponent;
import java.awt.*;
import java.net.*;
import java.io.*;
import javax.imageio.*;
import java.awt.image.*;

public class Run extends JComponent{

// Image to be drawn on screen
BufferedImage IMAGE;

// Output to be drawn on screen
String string = "";


// Loading a MAP file - includes loading a bmp image and a .map (txt file).
public Run(){

    // MAP name
    String map = "test";
    System.out.println("Loading map: "+map);

    // Get path
    String path = getClass().getProtectionDomain().getCodeSource().getLocation().getPath();

    String decodedPath = "";

    // Decode path
    try{
        decodedPath = URLDecoder.decode(path, "UTF-8");
        decodedPath = decodedPath.substring(0, decodedPath.lastIndexOf("/") + 1);
    } catch (Exception e){
        System.out.println("Could not decode path.");
        e.printStackTrace();
        System.exit(1);
    }

    // Add decoded path to output string
    string += decodedPath;


    try{
        IMAGE = ImageIO.read(new File(decodedPath+"/"+map+".bmp"));
        System.out.println("MAP image loaded.");
    } catch (IOException e){
        System.out.println("Could not load MAP image.");
        e.printStackTrace();
        System.exit(1);
    }

    try{
        System.out.println("Loading MAP data.");
        // Create a new reader
        FileReader in = new FileReader(new File(decodedPath+"/"+map+".map"));

        // While there is something left to be read
        while (in.ready()){
            // add the next input to the output string
            string += ", "+in.read();
        }

        // Close the input (for good measure)
        in.close();
        System.out.println("Loaded MAP data.");

    } catch (Exception e){
        System.err.println("Could not load MAP data.");
        e.printStackTrace();
        System.exit(1);
    }

    // Repaint the screen to show our newly loaded image and string
    repaint();
}

public void paint(Graphics g){
    g.drawImage(IMAGE,0,0,null);
    g.drawString(string,16,64);
}
}

这是创建JFrame并添加组件Run()

的主要方法
import javax.swing.JFrame;
import javax.swing.JComponent;

public class Test{
public static void main(String[] args){
    System.out.println("\nInitializing...");
    JFrame frame = new JFrame("Test");

    int frameWidth = 640;
    int frameHeight = 200;
    frame.setSize(frameWidth,frameHeight);
    frame.setResizable(false);
    frame.setLocation(240,60);

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().add(new Run());
    frame.setVisible(true);

    System.out.println("Running...");
}
}

0 个答案:

没有答案