Java JAR在终端中运行时可以正常启动,但双击时不能

Java JAR在终端中运行时可以正常启动,但双击时不能,java,file,jar,Java,File,Jar,所以我尝试用jar加载一个文件。该文件位于jar的外部,但位于同一文件夹中。当我使用java-jar Test.jar从终端运行jar时,它工作得很好,但是如果我双击jar运行它,它就不能从文件中正确加载。我可以用任何一种方法加载外部图像,但不是我创建的文件。这是在MacOSX上运行的。Ubuntu上似乎也存在这个问题。但是,在Windows上,文件的加载更不正确 对于这两种情况,从中加载的路径似乎是相同的。从终端运行时,数字输出正确。但是,当双击运行时,超过127的任何数字都会被错误加载。我已

所以我尝试用jar加载一个文件。该文件位于jar的外部,但位于同一文件夹中。当我使用java-jar Test.jar从终端运行jar时,它工作得很好,但是如果我双击jar运行它,它就不能从文件中正确加载。我可以用任何一种方法加载外部图像,但不是我创建的文件。这是在MacOSX上运行的。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();
    }
}
}
这是创建JFrame并添加组件Run()的主要方法


我使用终端创建jar,使用jar cvfm Test.jar manifest.txt*.class。我需要做些不同的事情吗?如果加载不正确,超过127的任何数字是什么意思?怎么会呢?它是以最大短路(65535)的形式加载的
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);
}
}
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...");
}
}