web-dev-qa-db-ja.com

デスクトップAPIは現在のプラットフォームではサポートされていません

このエラーが発生しました:

Java.lang.UnsupportedOperationException:デスクトップAPIは現在のプラットフォームではサポートされていません

私のJavaアプリケーションからファイルを開きます。この方法を使用します:

Desktop.getDesktop().open(new File(report.html"));

この問題を解決するにはどうすればよいですか?

22
user2520969

基本的に、問題はJavaデスクトップ統合がLinuxではうまく機能しないことです。

Windowsで正常に動作するように設計されています。他のシステムでは何かが機能しますが、適切なサポートを追加することを本当に気にかける人はいません。必要な「gnomeライブラリ」をインストールしても、結果は良くありません。

私は少し前に非常に同じ問題に直面し、以下のクラスを思いつきました。

目標は、システム固有のコマンドを使用して達成されます。

KDE:     kde-open
GNOME:   gnome-open
Any X-server system: xdg-open
MAC:     open
Windows: Explorer

これらのいずれも機能しない場合は、Java Desktopによって提供される実装を試みます。
これは通常失敗するため、最後の手段として試行されます。


DesktopApiクラス

このクラスは、静的メソッドopenbrowseおよびeditを提供します。
Linux(KdeおよびGnome)、Windows、Macで動作することがテストされています。

ご利用の場合はクレジットをお願いします。

package net.mightypork.rpack.utils;

import Java.awt.Desktop;
import Java.io.File;
import Java.io.IOException;
import Java.net.URI;
import Java.util.ArrayList;
import Java.util.List;


public class DesktopApi {

    public static boolean browse(URI uri) {

        if (openSystemSpecific(uri.toString())) return true;

        if (browseDESKTOP(uri)) return true;

        return false;
    }


    public static boolean open(File file) {

        if (openSystemSpecific(file.getPath())) return true;

        if (openDESKTOP(file)) return true;

        return false;
    }


    public static boolean edit(File file) {

        // you can try something like
        // runCommand("gimp", "%s", file.getPath())
        // based on user preferences.

        if (openSystemSpecific(file.getPath())) return true;

        if (editDESKTOP(file)) return true;

        return false;
    }


    private static boolean openSystemSpecific(String what) {

        EnumOS os = getOs();

        if (os.isLinux()) {
            if (runCommand("kde-open", "%s", what)) return true;
            if (runCommand("gnome-open", "%s", what)) return true;
            if (runCommand("xdg-open", "%s", what)) return true;
        }

        if (os.isMac()) {
            if (runCommand("open", "%s", what)) return true;
        }

        if (os.isWindows()) {
            if (runCommand("Explorer", "%s", what)) return true;
        }

        return false;
    }


    private static boolean browseDESKTOP(URI uri) {

        logOut("Trying to use Desktop.getDesktop().browse() with " + uri.toString());
        try {
            if (!Desktop.isDesktopSupported()) {
                logErr("Platform is not supported.");
                return false;
            }

            if (!Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)) {
                logErr("BROWSE is not supported.");
                return false;
            }

            Desktop.getDesktop().browse(uri);

            return true;
        } catch (Throwable t) {
            logErr("Error using desktop browse.", t);
            return false;
        }
    }


    private static boolean openDESKTOP(File file) {

        logOut("Trying to use Desktop.getDesktop().open() with " + file.toString());
        try {
            if (!Desktop.isDesktopSupported()) {
                logErr("Platform is not supported.");
                return false;
            }

            if (!Desktop.getDesktop().isSupported(Desktop.Action.OPEN)) {
                logErr("OPEN is not supported.");
                return false;
            }

            Desktop.getDesktop().open(file);

            return true;
        } catch (Throwable t) {
            logErr("Error using desktop open.", t);
            return false;
        }
    }


    private static boolean editDESKTOP(File file) {

        logOut("Trying to use Desktop.getDesktop().edit() with " + file);
        try {
            if (!Desktop.isDesktopSupported()) {
                logErr("Platform is not supported.");
                return false;
            }

            if (!Desktop.getDesktop().isSupported(Desktop.Action.EDIT)) {
                logErr("EDIT is not supported.");
                return false;
            }

            Desktop.getDesktop().edit(file);

            return true;
        } catch (Throwable t) {
            logErr("Error using desktop edit.", t);
            return false;
        }
    }


    private static boolean runCommand(String command, String args, String file) {

        logOut("Trying to exec:\n   cmd = " + command + "\n   args = " + args + "\n   %s = " + file);

        String[] parts = prepareCommand(command, args, file);

        try {
            Process p = Runtime.getRuntime().exec(parts);
            if (p == null) return false;

            try {
                int retval = p.exitValue();
                if (retval == 0) {
                    logErr("Process ended immediately.");
                    return false;
                } else {
                    logErr("Process crashed.");
                    return false;
                }
            } catch (IllegalThreadStateException itse) {
                logErr("Process is running.");
                return true;
            }
        } catch (IOException e) {
            logErr("Error running command.", e);
            return false;
        }
    }


    private static String[] prepareCommand(String command, String args, String file) {

        List<String> parts = new ArrayList<String>();
        parts.add(command);

        if (args != null) {
            for (String s : args.split(" ")) {
                s = String.format(s, file); // put in the filename thing

                parts.add(s.trim());
            }
        }

        return parts.toArray(new String[parts.size()]);
    }

    private static void logErr(String msg, Throwable t) {
        System.err.println(msg);
        t.printStackTrace();
    }

    private static void logErr(String msg) {
        System.err.println(msg);
    }

    private static void logOut(String msg) {
        System.out.println(msg);
    }

    public static enum EnumOS {
        linux, macos, solaris, unknown, windows;

        public boolean isLinux() {

            return this == linux || this == solaris;
        }


        public boolean isMac() {

            return this == macos;
        }


        public boolean isWindows() {

            return this == windows;
        }
    }


    public static EnumOS getOs() {

        String s = System.getProperty("os.name").toLowerCase();

        if (s.contains("win")) {
            return EnumOS.windows;
        }

        if (s.contains("mac")) {
            return EnumOS.macos;
        }

        if (s.contains("solaris")) {
            return EnumOS.solaris;
        }

        if (s.contains("sunos")) {
            return EnumOS.solaris;
        }

        if (s.contains("linux")) {
            return EnumOS.linux;
        }

        if (s.contains("unix")) {
            return EnumOS.linux;
        } else {
            return EnumOS.unknown;
        }
    }
}
45
MightyPork

Ubuntu 12.04 LTS 64ビットとOracle jdk1.6.0_45を使用していますが、同じ問題が発生していました。 Unityではなくデスクトップとしてgnome-classicを実行しています。これは私のために働いたものです:

_Sudo apt-get install libgnome2-0
_

このパッケージをインストールした後、Java Swingアプリを再起動し、Desktop.getDesktop().open(new File("myfile"));が正常に機能しました。

15
John

デスクトップクラスは、すべてのシステムでサポートされているわけではありません。

Java Swingチュートリアル デスクトップクラスと統合する方法 から:

IsDesktopSupported()メソッドを使用して、デスクトップAPIが使用可能かどうかを判断します。 SolarisオペレーティングシステムとLinuxプラットフォームでは、このAPIはGnomeライブラリに依存しています。これらのライブラリが利用できない場合、このメソッドはfalseを返します。デスクトップAPIがサポートされている、つまりisDesktopSupported()がtrueを返したと判断すると、アプリケーションは静的メソッドgetDesktop()を使用してデスクトップインスタンスを取得できます。

いずれにせよ、デスクトップがサポートされていない場合は、ファイルを開く別の方法を提供するのが最善です。

7
Modus Tollens

サポートは、さまざまなJDKの実装によって異なります。 OpenJDK 1.7.0で「UnsupportedOperationException」が発生しました。 Oracle JDK 1.7への切り替えが機能しました。

実際には、JDKを切り替えるか、ユーザーがJDKを切り替えて特定の機能を有効にすることを提案できます。

0
Mark McDonald