【问题标题】:Java Standalone runnable GUI application - can't get jar file to open the programJava Standalone 可运行的 GUI 应用程序 - 无法获取 jar 文件来打开程序
【发布时间】:2013-08-22 18:13:30
【问题描述】:

我正在开发一个 GUI 客户端,它将是一个独立的应用程序,充当 MySQL 数据库后端的前端。我已经为客户端完成了所有逻辑和编码,但我无法将项目导出到可运行的 .jar 文件。

我有 Eclipse 生成的 manifest.txt,它位于 META-INF 文件夹中。

这是我的主要方法:

package binaparts.main;

import binaparts.gui.*;

public class Main{

public static void main(String[] args){

    MainFrames m = new MainFrames();
    m.displayGUI();
}
}

这是 MainFrames 类:

package binaparts.gui;

import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.ItemListener;
import java.sql.*;

import javax.swing.AbstractButton;
import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.ComboBoxModel;
import javax.swing.DefaultComboBoxModel;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
import javax.swing.LayoutStyle.ComponentPlacement;

import org.json.JSONArray;
import org.json.JSONObject;

import binaparts.dao.*;
import binaparts.properties.ConfigurationManager;

public class MainFrames extends JFrame
{
private MainPanel main;
private CreatePanel create;
private UpdatePanel update;
private FindPanel find;
private SettingsPanel settings;
private ManageUsersPanel Manage;
JFrame frame = new JFrame("Main Menu:");
static final String configFilePath = "META-INF/config.properties";
DBConnect con = new DBConnect();
ConfigurationManager config = null;

public void run(){
  displayGUI();
}

public void displayGUI()
{
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JPanel contentPane = new JPanel();
    contentPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
    contentPane.setLayout(new CardLayout());
    main = new MainPanel(contentPane);
    create = new CreatePanel(contentPane);
    update = new UpdatePanel(contentPane);
    find = new FindPanel(contentPane);
    settings = new SettingsPanel(contentPane);
    Manage = new ManageUsersPanel(contentPane);
    contentPane.add(main, "Main Menu");
    contentPane.add(create, "Create Part");
    contentPane.add(update, "Update Part");
    contentPane.add(find, "Find Part");
    contentPane.add(settings, "Settings");
    contentPane.add(Manage, "Manage Users");
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    int height = screenSize.height;
    int width = screenSize.width;
    frame.setResizable(false);
    frame.setSize(width/2, height/2);
    frame.setLocationRelativeTo(null);
    frame.setSize(700, 580);
    frame.setContentPane(contentPane);
    frame.setVisible(true); 
}
class MainPanel extends JPanel{Contains code for that frame}
class MainPanel extends JPanel{Contains code for that frame}
class CreatePanel extends JPanel{Contains code for that frame}
class UpdatePanel extends JPanel{Contains code for that frame}
class FindPanel extends JPanel{Contains code for that frame}
class SettingsPanel extends JPanel{Contains code for that frame}
class ManageUsersPanel extends JPanel{Contains code for that frame}
}

我没有包含每个面板的代码,以免造成混乱。还有一些其他类用于管理配置属性和数据库连接,它们工作得很好。

我的问题是:我的主要方法/displayGUI交互或创建jar的过程是否有问题?

提前感谢您的帮助!

我运行了 cmd java -jar my.jar 并得到了

Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

C:\Users\Danny>cd desktop

C:\Users\Danny\Desktop>cd executable

C:\Users\Danny\Desktop\Executable>java -jar BinaPartsManager.jar
java.io.FileNotFoundException: META-INF\config.properties (The system cannot fin
d the path specified)
        at java.io.FileOutputStream.open(Native Method)
        at java.io.FileOutputStream.<init>(Unknown Source)
        at java.io.FileOutputStream.<init>(Unknown Source)
        at binaparts.properties.ConfigurationManager.save(ConfigurationManager.j
ava:41)
        at binaparts.properties.ConfigurationManager.<init>(ConfigurationManager
.java:21)
        at binaparts.dao.DBConnect.verifyUser(DBConnect.java:87)
        at binaparts.gui.MainFrames$MainPanel.setStatus(MainFrames.java:110)
        at binaparts.gui.MainFrames$MainPanel.<init>(MainFrames.java:137)
        at binaparts.gui.MainFrames.displayGUI(MainFrames.java:66)
        at binaparts.main.RunProgram.main(RunProgram.java:10)
java.lang.NullPointerException
        at binaparts.dao.DBConnect.close(DBConnect.java:21)
        at binaparts.gui.MainFrames$MainPanel.setStatus(MainFrames.java:127)
        at binaparts.gui.MainFrames$MainPanel.<init>(MainFrames.java:137)
        at binaparts.gui.MainFrames.displayGUI(MainFrames.java:66)
        at binaparts.main.RunProgram.main(RunProgram.java:10)
Exception in thread "main" java.lang.NullPointerException
        at javax.swing.ImageIcon.<init>(Unknown Source)
        at binaparts.gui.MainFrames$MainPanel.<init>(MainFrames.java:147)
        at binaparts.gui.MainFrames.displayGUI(MainFrames.java:66)
        at binaparts.main.RunProgram.main(RunProgram.java:10)

我将 config.properties 文件存储在 META-INF 文件夹中。不过它在 IDE 中运行良好。

【问题讨论】:

  • 您可以发布清单文件的内容吗?它应该有关于 Main-Class 的内容。
  • 1) 使用java -jar the.jar 从命令行运行它并复制/粘贴输出。 2) 为了尽快获得更好的帮助,请发帖SSCCE
  • 您是否导出为可运行的 Jar 文件?你需要这样做。首先在设置主类的地方创建一个运行配置(Project -> Run As -> Run Configurations),然后 Export -> Java -> Runnable JAR File 并选择所需的运行配置。如果您认为自己已经这样做了,请附上清单样本。
  • 否则你可以尝试创建JAR文件manually
  • manifest文件的内容是:Manifest-Version: 1.0 Main-Class: binaparts.main.RunProgram 所以在Main-Class行后面多了一个空的新行

标签: java mysql swing jar runnable


【解决方案1】:

另一个提示:使用

java.awt.*; //to import everything from java.awt
javax.swing.*; //to import everything from javax.swing

【讨论】:

    【解决方案2】:

    再次重申:“您可以使用 Java 资源将属性文件加载为 (有关相关教程,请参阅 tag info),尽管您不能在其中存储将要更改的值”。你还没有说他们是否会改变。

    如果您要存储一些东西,那么(新的)方法就是使用java.util.Preferences API。

    如果你真的需要自己的文件,我想用户的主目录是放置你自己的目录来存储文件的地方,查找user.home作为系统参数。

    【讨论】:

    • @trashgod 即使像现在使用我的程序那样使用属性设置,也会在双击 jar 时在 jar 文件所在的相同位置创建一个 config.properties 文件。 GUI 仍然什么都不做。即使单击其中一个按钮会导致错误,我至少不应该让 GUI 显示吗?
    • "...双击 jar 时。" - 在你开始运行之前,我建议你坚持使用命令行启动,以便有一个命令窗口来显示错误和堆栈跟踪。 GUI 是否会显示取决于代码的编写方式;例如,如果(仅一个示例),您试图从 configProperties 获取一个值,然后尝试取消引用它,这将给出一个空指针并崩溃。错误消息是获取有关为什么某些内容无法正常工作的信息的最佳方式,如果没有它们,我们无法在 SO 方面为您提供太多帮助。
    • @Danny:只是猜测,您正在打开File,而您应该使用getResourceAsStream()
    • @trashgod:实际上我们已经介绍过了;单击原始帖子的 cmets 的“查看更多 cmets”按钮。我们已经确定 OP 有一个文件,它解释了为什么它可以在开发环境中工作,但不能在 jar 中工作。他现在似乎还有其他问题。
    • 对于我最初的问题,我发现调用图像以创建面板的文件路径在某些调用中是“/Images/picture.jpg”,而它应该是“/ images/picture.jpg" 这导致 GUI 在 IDE 之外根本无法为程序打开,但在 IDE 内部可以正常工作。
    猜你喜欢
    • 1970-01-01
    • 2014-11-10
    • 2020-11-13
    • 2016-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    相关资源
    最近更新 更多