¿El comando Desktop#browse es compatible con la plataforma Linux únicamente en el entorno de escritorio Gnome?
Ejecutar mi aplicación Java con este código:
if (Desktop.isDesktopSupported()) {
Desktop d = Desktop.getDesktop();
try {
d.browse(new URI("someurl")); // someurl es solo un ejemplo, estoy abriendo una URL real
} catch (IOException | URISyntaxException e) {
logger.warn(ExceptionUtils.getStackTrace(e));
}
}
resulta en que la aplicación no responde (probablemente un bloqueo) en Manjaro Linux KDE. Mientras que funciona sin problemas en Windows, no quiero verificar el sistema operativo en mi aplicación y permitirlo solo para Windows. Aún no he probado en otras plataformas.
Lo que uso:
– Adoptium JDK 11
– Manjaro kernel 5.10.83-1-MANJARO de 64 bits
– KDE Plasma 5.23.4
– Qt 5.15.2
Ubicación detallada del bloqueo:
Clase Desktop
:
public void browse(URI uri) throws IOException {
checkAWTPermission();
checkExec();
checkActionSupport(Action.BROWSE);
Objects.requireNonNull(uri);
peer.browse(uri); // <--- aquí ocurre
}
El bloqueo ocurre en la clase XDesktopPeer
que implementa la interfaz DesktopPeer
(peer
) en el método gnome_url_show(...)
:
private void launch(URI uri) throws IOException {
byte[] uriByteArray = (uri.toString() + '\0').getBytes();
boolean result = false;
XToolkit.awtLock();
try {
if (!nativeLibraryLoaded) {
throw new IOException("Failed to load native libraries.");
}
result = gnome_url_show(uriByteArray); // <--- bloqueo / aplicación no responde aquí
} finally {
XToolkit.awtUnlock();
}
if (!result) {
throw new IOException("Failed to show URI:" + uri);
}
}
Entonces… ¿el método Desktop#browse
es compatible en la plataforma Linux solo para el escritorio Gnome?
Estoy suponiendo esto debido al nombre del método.
Si es así, ¿puedo realizar una verificación de bloqueo alrededor de mi código para evitar esto en mi aplicación, en lugar de verificar el sistema operativo y las distribuciones?
davy.ai
Parece que el método
Desktop#browse
solo es compatible en plataformas Linux para escritorios Gnome, como sugiere el nombre del métodognome_url_show
en la claseXDesktopPeer
.Para evitar bloqueos en su aplicación, puede intentar ejecutar el método
Desktop#browse
en un hilo separado o utilizar unSwingWorker
para ejecutar el método en segundo plano. Esto evitará que el hilo principal sea bloqueado y mantendrá su aplicación receptiva. Además, puede capturar las excepcionesInterruptedException
eInvocationTargetException
para manejar cualquier problema potencial con el hilo en segundo plano.