最近安装了 debian trixie,用我之前写的 https://github.com/hellodk34/link-cleaner 这个程序,下载了jar包到本地,执行之后发现程序正常输出了,但是并没有将新的内容写入到系统剪贴板里。后来我才发现是 windows/macos 与 Linux 窗口工作机制不一样有关。

具体窗口工作的原理我尚未搞清楚。但以下代码在 linux 上不工作是因为 AWT API 在 linux 上处理方式不同导致的,具体的我还真说不上来。

// Windows、macOS 可以持久化这个内容到系统剪贴板
StringSelection stringSelection = new StringSelection(myString);
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
clipboard.setContents(stringSelection, null);

但在 linux 下我们可以借助其他工具,安装 xclip 或者 xsel

此处我安装 xclip,源代码也使用的 xclip,源代码处理方式

private void setClipboardUsingXClipOnLinux(String text) {
        // 加入 -n 选项以避免 echo 在末尾自动添加换行
        String[] cmd = {"/bin/bash", "-c", "echo -n " + escape(text) + " | xclip -selection clipboard"};
        try {
            Runtime.getRuntime().exec(cmd);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    // 适当地转义文本中的特殊字符
    private String escape(String text) {
        return "'" + text.replace("'", "'\\''") + "'";
    }

安装方法

# deb 系
$ sudo apt install -y xclip
# rpm 系,下面两个命令一般二选一即可,老的 CentOS 可能还是 yum,较新的 Fedora 或者 Rocky Linux、OpenEuler 都可以直接使用 dnf
$ sudo yum install -y xclip
$ sudo dnf install -y xclip

安装 v1.1.0 版本的 jar 包,在 release 页 https://github.com/hellodk34/link-cleaner/releases/tag/v1.1.0

确保linux本地有安装 java11,export 了环境变量之后,在任意位置,任意用户都能正常调用 java 命令,以下命令就能正常工作

$ java -jar link-cleaner-v1.1.0.jar 
your original clipboard text is: 【无人区太大了走了5天还没走出去,今天晚上在桥洞里睡觉,这里比较安全一点】 https://www.bilibili.com/video/BV1Vm4215729/?share_source=copy_web&vd_source=f3e330de995a48b819604c85bc0d59e7

your new clipboard text is: 【无人区太大了走了5天还没走出去,今天晚上在桥洞里睡觉,这里比较安全一点】  https://www.bilibili.com/video/BV1Vm4215729/

【无人区太大了走了5天还没走出去,今天晚上在桥洞里睡觉,这里比较安全一点】 https://www.bilibili.com/video/BV1Vm4215729/ 也被成功写入系统剪贴板。

参考:Linux下Java剪贴板的访问