用Eclipse导出后,我的runnable JAR不会打开,可能是因为资源

时间:2016-02-16 16:54:00

标签: java eclipse export

我已经搜遍了整个互联网上的几十个主题(包括stackoverflow),我找不到任何帮助我的东西,也许是因为我太愚蠢而无法理解它。我可能是Java的新手。

无论如何,程序在Eclipse内运行完美,它可以获取所有需要的图像,文件等。一旦我将它作为可运行的JAR导出,我就无法打开它,甚至没有命令提示符(说& #34;无法访问)。

这是我尝试的,导入资源:

package main;

import java.io.File;

public class Loader {

    public static String path = "/Z:/Eclipse/workspace/FirstGame/src/";

    static File smoothFont;
    static File roughFont;
    static File alahuSong;
    static File deathAlahu;
    static File hitSoundAlahu;
    static File hitSoundBit;
    static File deathBit;
    static File hpBit;
    static File selectbit;
    static File songBit;
    static File colorFile;
    static File easyScoreFile;
    static File normalScoreFile;
    static File hardScoreFile;
    static File insaneScoreFile;
    static File meSteam;
    static File manelFaxe;
    static File mePassado;
    static File manelSteam;

    public static void load(Game game) {
        game.getClass().getResource(path + "res/summerStormSmooth.ttf");
        game.getClass().getResource(path + "res/summerStormRough.ttf");
        game.getClass().getResource(path + "res/alahuSong.ogg");
        game.getClass().getResource(path + "res/deathAlahu.ogg");
        game.getClass().getResource(path + "res/hitSoundAlahu.ogg");
        game.getClass().getResource(path + "res/hitSoundBit.ogg");
        game.getClass().getResource(path + "res/deathBit.ogg");
        game.getClass().getResource(path + "res/hpBit.ogg");
        game.getClass().getResource(path + "res/selectBit.ogg");
        game.getClass().getResource(path + "res/songBit.ogg");
        game.getClass().getResource(path + "res/colorFile.txt");
        game.getClass().getResource(path + "res/easyScoreFile.txt");
        game.getClass().getResource(path + "res/normalScoreFile.txt");
        game.getClass().getResource(path + "res/hardScoreFile.txt");
        game.getClass().getResource(path + "res/insaneScoreFile.txt");
        game.getClass().getResource(path + "res/meSteam.png");
        game.getClass().getResource(path + "res/manelFaxe.png");
        game.getClass().getResource(path + "res/mePassado.png");
        game.getClass().getResource(path + "res/manelSteam.png");
    }
}

此外,这是我的构建的组织方式: :D

我可以为您提供所需的更多信息,感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您传递的字符串值无效。 Class.getResource接受的String参数不是文件名。

您应该传递相对于.jar根目录的路径。如果您不确定.jar文件中确切包含哪些文件,请检查Eclipse中的.jar文件,或使用命令窗口查看带有 jar tf MyApplication的.jar文件的.jar

如果项目设置正确,它可能会将res目录的内容捆绑到最终的.jar文件中,在这种情况下,调用Class.getResource的正确方法是:

static URL smoothFont;
static URL roughFont;
// ...
static URL colorFile;
// ...
static URL meSteam;

public static void load(Game game) {
    smoothFont = Loader.class.getResource("/summerStormSmooth.ttf");
    roughFont = Loader.class.getResource("/summerStormRough.ttf");
    // ...
    colorFile = Loader.class.getResource("/colorFile.txt");
    // ...
    meSteam = Loader.class.getResource("/meSteam.png");
    // ...
}

在<.jar文件中时,无法将数据称为File,因为它们只是表示压缩数据的.jar文件字节序列中的条目 - 而不是实际的单独文件。

幸运的是,加载URL就像加载文件一样简单:

Font loadedSmoothFont;
try (InputStream stream = smoothFont.openStream()) {
    loadedSmoothFont = Font.createFont(Font.TRUETYPE_FONT, stream);
}

String colorFileContents;
try (Scanner scanner = new Scanner(colorFile.openStream())) {
    colorFileContents = scanner.useDelimiter("\\z").next();
}

BufferedImage meSteamImage = ImageIO.read(meSteam);