【问题标题】:Why is my Runnable Jar file not working为什么我的 Runnable Jar 文件不起作用
【发布时间】:2013-05-22 21:51:04
【问题描述】:

我学习了大约 10 个不同的教程,但似乎没有一个能奏效,我的可运行 jar 文件无法正常工作。

当我在 Eclipse 中运行时,我的游戏运行良好,并且我能够将它变成一个可运行的 jar 文件,该文件仅在一两天前工作,并且没有改太多代码。当我尝试运行 .jar 时,我的屏幕底部会弹出一个 java 图标,但随后什么也没有发生。

这是我的启动器无法打开(如果我在没有启动器的情况下运行它可以正常工作),无论我使用终端还是 Eclipse 打开都没有错误。

package com.l3g3nds.threed;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.io.File;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

public class Launcher extends JFrame implements MouseListener, MouseMotionListener {
    private static final long serialVersionUID = 1L;

    protected JPanel window = new JPanel();
    // private JButton play, options, help, quit, credits;
    // private Rectangle rplay, roptions, rhelp, rquit, rcredits;

    protected int buttonWidth = 120;
    protected int buttonHeight = 40;

    public Launcher(int id) {
        JPanel panel = (JPanel) getContentPane();

        JLabel label = new JLabel();
        label.setIcon(new ImageIcon("res/Launcher/schoolbackground.png"));
        System.out.println(Display.lScreen());
        if (Display.lScreen() == 5)
            label.setIcon(new ImageIcon("res/Launcher/quit1.png"));
        if (Display.lScreen() == 4)
            label.setIcon(new ImageIcon("res/Launcher/credits1.png"));
        if (Display.lScreen() == 3)
            label.setIcon(new ImageIcon("res/Launcher/options1.png"));
        if (Display.lScreen() == 2)
            label.setIcon(new ImageIcon("res/Launcher/help1.png"));
        if (Display.lScreen() == 1)
            label.setIcon(new ImageIcon("res/Launcher/beginrunning1.png"));
        panel.add(label);

        setUndecorated(true);

        System.out.println("launched");
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        setLocationRelativeTo(null);
        pack();
        setVisible(true);

        addMouseListener(this);
        addMouseMotionListener(this);

    }

    public void drawButtons() {
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        int cx = e.getX();
        int cy = e.getY();
        if (cx >= 11 && cy >= 14 && cx <= 214 && cy <= 44) {
            dispose();
            new RunGame();
        } else if (cx >= 11 && cy >= 66 && cx <= 70 && cy <= 96) {
            //open help
        } else if (cx >= 11 && cy >= 119 && cx <= 119 && cy <= 144) {
            this.dispose();
            new Options();
        } else if (cx >= 11 && cy >= 170 && cx <= 114 && cy <= 200) {
            //open credits
        } else if (cx >= 11 && cy >= 222 && cx <= 74 && cy <= 254) {
            System.exit(0);
        }

    }

    @Override
    public void mouseEntered(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseExited(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mousePressed(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseReleased(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseDragged(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseMoved(MouseEvent e) {
        // TODO Auto-generated method stub
        int mx = e.getX();
        int my = e.getY();
        if (mx >= 11 && my >= 14 && mx <= 214 && my <= 44) {
            if (Display.lScreen() != 1) {
                Display.setlScreen(1);
                new Launcher(1);
                System.out.println("1");
            }
        } else if (mx >= 11 && my >= 66 && mx <= 70 && my <= 96) {
            if (Display.lScreen() != 2) {
                Display.setlScreen(2);
                new Launcher(1);
                System.out.println("2");
            }
        } else if (mx >= 11 && my >= 119 && mx <= 119 && my <= 144) {
            if (Display.lScreen() != 3) {
                Display.setlScreen(3);
                new Launcher(1);
                System.out.println("3");
            }
        } else if (mx >= 11 && my >= 170 && mx <= 114 && my <= 200) {
            if (Display.lScreen() != 4) {
                Display.setlScreen(4);
                new Launcher(1);
                System.out.println("4");
            }
        } else if (mx >= 11 && my >= 222 && mx <= 74 && my <= 254) {
            if (Display.lScreen() != 5) {
                Display.setlScreen(5);
                new Launcher(1);
                System.out.println("5");
            }
        }
        else {
            if (Display.lScreen() != 0) {
                Display.setlScreen(0);
                new Launcher(1);
                System.out.println("0");
            }
        }
    }
}

如果有帮助,我正在使用 mac...

这是我所采取的确切步骤的屏幕截图

我收到了一些警告(我认为它们只是因为未使用的变量,当我能够让我的 .jar 工作时,我早些时候收到了这条消息)

这似乎是我的屏幕顶部以及底部的 java 图标,但没有其他任何反应。

-谢谢

【问题讨论】:

  • 但是您遗漏了最重要的信息。你说它在一两天前就起作用了,"and have not changed too much code.",但你所做的最改变的实际上非常重要。那么......你到底改变了什么?如果没有更多这些关键信息,我认为我们注定无法为您提供帮助。请注意,您可以删除您发布的图片,因为它们根本无法帮助您找到问题的根源。
  • 您最近是否向您的应用添加了任何 jar 或类?
  • 从命令行运行jar文件(使用java -jar theJar.jar),看看是否报错。
  • 我收到此错误“无法访问 jarfile {Run.jar}”
  • 编辑您的问题并发布剔除、完整和准确的错误及其堆栈跟踪。

标签: java jar


【解决方案1】:

我假设您正在制作一个 GUI 应用程序,并通过单击它来启动 Jar?很多时候,如果 GUI 应用程序在启动时出现错误,它不会做任何事情,比如弹出错误消息,因为它还没有机会构建任何类型的 GUI 来报告错误。我猜您更改的某些内容会在启动时导致异常,并且该消息不可见,因为您通过单击它来启动 jar。

如果您改为从终端运行 Jar(聚焦:“终端”),您将能够看到阻止 Jar 运行的堆栈跟踪,希望这将有助于您进一步调试。

$ cd directory/of/jar
$ java -jar name_of_jar.jar
  .... stack trace should appear here, or program should run

您也可以尝试在 main 方法和 display a GUI alert 中捕获异常,但是如果在 main 方法启动之前引发异常(例如,在类加载期间),这将不起作用。换句话说,这是一个不错的选择,但并不能完全解决问题。您可能仍需要从命令行运行 Jar。

public static void main(String[] args) {
  try {
    // body of main method goes here, including any other error handling
  } catch (Throwable t) {
    JOptionPane.showMessageDialog(
        null, t.getClass().getSimpleName() + ": " + t.getMessage());
    throw t; // don't suppress Throwable
  }
}

【讨论】:

  • 好的,它正在启动(打印出它已经启动)但游戏的实际启动器没有出现
  • 啊,我找到了问题所在,但不知道如何解决。
  • @java - 通过编辑您的问题发布堆栈跟踪。如果您发布整个堆栈跟踪,将很容易识别您的问题。
  • @jahroy 什么是堆栈跟踪?
  • @java - "什么是堆栈跟踪?" --> More info here.如果您想成为一名 Java 开发人员,学习阅读和解释堆栈跟踪是必须学习的最基本的事情之一。
【解决方案2】:

要运行 .jar 文件,在命令行中写入:

java -jar 'jar_file'.jar

'jar_file' 是您的 jar 文件的名称,不带任何引号。在您的情况下,它似乎是run.jar

.jar文件是.zip档案,会混淆操作系统

Jar file format

【讨论】:

  • 它如何混淆操作系统? (即使确实如此,这如何解决问题?您可能需要提供更多详细信息;OP 说它曾经有效。)
  • 无法访问 jarfile {Run.jar}
  • 去掉花括号,对不起
  • @Isaac 我找到了我的错误所在的类,但我仍然不知道为什么它不起作用...
  • 这无疑会运行你的程序,剩下的由你来调试。当然,您遇到的任何具体问题都可以在这里发布
【解决方案3】:

检查您的 Java 版本。

如果您的程序是针对 Java 8 编译的,并且您 PC 上的 Java 版本是 Java 9 或更高版本,那么它可能无法运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-22
    • 2019-08-29
    • 2012-10-11
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    相关资源
    最近更新 更多