Итак, я сделал очень быстрый тест, используя ...
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JLabel;
import com.apple.eawt.Application;
public class Test {
public static void main(String[] args) {
try {
Application application = Application.getApplication();
application.setDockIconImage(ImageIO.read(Test.class.getResource("/javaapplication163/bunny.jpg")));
} catch (IOException ex) {
ex.printStackTrace();
}
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public static class TestPane extends JPanel {
public TestPane() {
add(new JLabel("Hello"));
}
}
}
И он показал ...

Аккуратно ... однако, это будет компилироваться и запускаться только на Mac.
«Типичным» решением этой проблемы было бы использование отражения, чтобы попытаться загрузить com.apple.eawt.Application
во время выполнения, что-то вроде ...
try {
Class appClass = Class.forName("com.apple.eawt.Application");
Class params[] = new Class[]{Image.class};
Method getApplication = appClass.getMethod("getApplication");
Object application = getApplication.invoke(appClass);
Method setDockIconImage = appClass.getMethod("setDockIconImage", params);
setDockIconImage.invoke(application, ImageIO.read(Test.class.getResource("/javaapplication163/bunny.jpg")));
} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | ClassNotFoundException | IOException ex) {
ex.printStackTrace();
}
Но это кое-какая ошибкалегкомысленный и грязный, не говоря уже о полной боли в ... поддерживаемом коде.
Итак, я подумал, что могу попробовать использовать параметры командной строки, как показано на Значок док-станции ...
-Xdock:name="Hello bunny" -Xdock:icon=/path/to/bunny.jpg
, который тоже работал.
Хотя я и предпочитаю это решение, это означает, что значок нужно извлекать из Jar, что является проблемой, и вам, вероятно, потребуется указать полный рабочий путь.
Если бы я должен был сгенерировать пакет приложений для своего проекта, я бы, вероятно, следовал этому, но если бы я просто развертывал Jar, у меня могло бы возникнуть желание использовать один из предыдущих методов