Проблема в том, как вы получаете ресурсы. попробуйте это:
menuElementHilfe.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
File hilfe = new File(getClass().getResource("/resources/Hilfe.pdf").getFile());
try {
java.awt.Desktop.getDesktop().open(hilfe);
} catch (IOException e) {
e.printStackTrace();
}
}
});
При работе в Eclipse вы нацеливаетесь на файл в вашем пути сборки.
При запуске из JAR / WAR, URL отличается и выглядит как "jar: file: /your-path/your-jar.jar! /Hilfe.pdf" , который вы не задаете при вызове new Файл (...) Таким образом, чтобы получить правильный URL для внутренних ресурсов, вы должны использовать такие методы, как getResource или getResourceAsStream, в зависимости от ваших потребностей.
Проверьте следующие пояснения для получения дополнительной информации :)
https://docs.oracle.com/javase/8/docs/technotes/guides/lang/resources.html
[EDIT]
Я предполагаю, что вы работаете над некоторым приложением Swing, но я не знаю, знаете ли вы, что выполнение таких задач в потоке AWT-EventQueue заморозит ваш пользовательский интерфейс.
Чтобы предотвратить это, вы должны запускать вещи, не связанные с пользовательским интерфейсом, в другом потоке.
Это сделано с использованием метода SwingUtilities.invokeLater (Java 5 и более ранних версий) и / или класса SwingWorker (начиная с Java 6).
как указано в этом ответе
Вы должны поместить предыдущее решение в нечто вроде этого:
SwingUtilities.invokeLater(new Runnable() {
public void run() {
// Your UI unrelated code here
}
});