Java 程序 - 在 Eclipse 中有效但在 JAR 中无效 - FreeTTS

Java Program - Works in Eclipse but Not in JAR - FreeTTS

我一直在创建一个 Java 程序,它 运行 在 Eclipse 中完全没有错误。 当我将它编译成 .jar 和 运行 时,我得到这个错误:

java.lang.NullPointerException
        at javaVoice.Speech.say(Speech.java:12)
        at javaVoice.Respond.toText(Respond.java:58)
        at javaVoice.GUI.actionPerformed(GUI.java:85)
        at javax.swing.JTextField.fireActionPerformed(Unknown Source)
        at javax.swing.JTextField.postActionEvent(Unknown Source)
        at javax.swing.JTextField$NotifyAction.actionPerformed(Unknown Source)
        at javax.swing.SwingUtilities.notifyAction(Unknown Source)
        at javax.swing.JComponent.processKeyBinding(Unknown Source)
        at javax.swing.JComponent.processKeyBindings(Unknown Source)
        at javax.swing.JComponent.processKeyEvent(Unknown Source)
        at java.awt.Component.processEvent(Unknown Source)
        at java.awt.Container.processEvent(Unknown Source)
        at java.awt.Component.dispatchEventImpl(Unknown Source)
        at java.awt.Container.dispatchEventImpl(Unknown Source)
        at java.awt.Component.dispatchEvent(Unknown Source)
        at java.awt.KeyboardFocusManager.redispatchEvent(Unknown Source)
        at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(Unknown Source)

        at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(Unknown Source)
        at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(Unknown Source)
        at java.awt.DefaultKeyboardFocusManager.dispatchEvent(Unknown Source)
        at java.awt.Component.dispatchEventImpl(Unknown Source)
        at java.awt.Container.dispatchEventImpl(Unknown Source)
        at java.awt.Window.dispatchEventImpl(Unknown Source)
        at java.awt.Component.dispatchEvent(Unknown Source)
        at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
        at java.awt.EventQueue.access0(Unknown Source)
        at java.awt.EventQueue.run(Unknown Source)
        at java.awt.EventQueue.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain.doIntersectionPrivilege(Unknown Source)
        at java.security.ProtectionDomain.doIntersectionPrivilege(Unknown Source)
        at java.awt.EventQueue.run(Unknown Source)
        at java.awt.EventQueue.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain.doIntersectionPrivilege(Unknown Source)
        at java.awt.EventQueue.dispatchEvent(Unknown Source)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.run(Unknown Source)

当我尝试执行 voice.allocate(); 时,我完全确定这些错误来自 FreeTTS; (我用 try/catch 包围了代码以确保它在那里捕获了异常。) 这是 Speech.java,导致错误的 class。

package javaVoice;

import com.sun.speech.freetts.Voice;
import com.sun.speech.freetts.VoiceManager;

public class Speech {
    public static void say(String toSay) {
        try {
            Voice voice;
            VoiceManager voiceManager = VoiceManager.getInstance();
            voice = voiceManager.getVoice(Main.speakVoice);
            voice.allocate();
            voice.speak(toSay);
        }
        catch (Exception e) {
            System.out.println("Something went wrong while javaVoice tried to talk!");
            if (Main.debugMode) {
                e.printStackTrace();
            }
        }
    }
    public static void sayPrint(String toSay) {
        try {
            Voice voice;
            VoiceManager voiceManager = VoiceManager.getInstance();
            voice = voiceManager.getVoice(Main.speakVoice);
            voice.allocate();
            voice.speak(toSay);
            System.out.println(toSay);
        }
        catch (Exception e) {
            System.out.println("Something went wrong while javaVoice tried to talk!");
            if (Main.debugMode) {
                e.printStackTrace();
            }
        }
    }
}

错误是调用其中一个方法引起的,错误所在的行总是where voice.allocate();是。 我怎样才能使我的程序作为 .jar 文件工作?我做错了什么?!

假设 FreeTTS 是您依赖的独立 jar,您有两个选择:

  1. 你可以按照答案here把所有东西都装在一个罐子里
  2. 执行 jar 时,您必须在类路径中指定第二个 jar。例如:java -cp .:path/to/your/jar/yourjar.jar:path/to/other/jar/FreeTTS.jar com.main.method.Class