为什么我的Runnable Jar文件不起作用
我关注了大约10个不同的教程,其中没有一个似乎可以解决问题,我的runnable jar文件无效。
I followed about 10 different tutorials and none of them seemed to do the trick, my runnable jar file just isn't working.
我的游戏运行很好当我在eclipse中运行它时,我能够将它变成一个可运行的jar文件,仅在一两天前工作并且没有更改过多的代码。当我尝试运行.jar时,屏幕底部会弹出一个java图标但是没有任何反应。
My game runs fine when I run it in eclipse, and I was able to make it into a runnable jar file that worked only a day or two ago and have not changed too much code. When I try to run the .jar a java icon pops up at the bottom of my screen but then nothing happens.
这是我的启动器无法打开(如果我运行的话)没有启动器它工作正常),没有错误我打开终端或日食。
It's my launcher is failing to open (if I run without launcher it works fine), there are no errors wether I open with terminal or 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,如果这有帮助...
以下是我拍摄的确切步骤的截屏
Here are screen shots that I took of the exact steps I took
我得到的一些警告(我认为它们只是因为未使用的变量,我得到这个消息的时候我才能得到这个消息我的.jar工作)
Some warnings I got (I think they are only because of unused variables, I got this message earlier when I was able to get my .jar to work)
这似乎是我的屏幕顶部和底部的java图标,但没有其他事情发生。
This appears that the top of my screen along with the java icon at the bottom, but nothing else happens.
-Thanks
我假设你正在制作一个GUI应用程序,点击它启动Jar?很多时候,如果GUI应用程序在启动时出错,它不会明显地执行任何操作,例如弹出错误消息,因为它还没有机会构建任何类型的GUI来报告错误。我猜你改变的东西会在启动时导致异常,并且该消息不可见,因为你通过点击它来启动jar。
I assume you're making a GUI application, and launching the Jar by clicking on it? Many times if a GUI application has an error at startup, it doesn't visibly do anything, like pop an error message, because it hasn't had a chance to build any sort of GUI to report the error to yet. I would guess that something you changed causes an exception at startup, and that message is not visible because you're launching the jar by clicking on it.
如果你运行从终端罐子(聚光灯:终端)你将能够看到阻止你的Jar运行的堆栈跟踪,并希望这将有助于你进一步调试。
If you run the Jar from the terminal instead (spotlight: "terminal") you will be able to see the stack trace that's preventing your Jar from running, and hopefully that will help you debug further.
$ cd directory/of/jar
$ java -jar name_of_jar.jar
.... stack trace should appear here, or program should run
您还可以尝试在 main 方法和显示GUI警报,但是如果在 main
方法启动之前引发异常(例如在类加载期间)。换句话说,这是一个很好的,但并不能完全解决问题。您可能仍需要从命令行运行Jar。
You can also try to catch the exception in your main
method and display a GUI alert, however this doesn't work if the exception is raised before the main
method starts (e.g. during class loading). In other words it's a nice-to-have, but doesn't totally solve the problem. You may still need to run the Jar from the command line.
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
}
}