java - 无法在 nixos 上运行 groovy 脚本

标签 java groovy x11 nixos

我正在尝试从 nixos 运行这个 groovy 脚本

#!/usr/bin/env groovy

@Grapes(
    @Grab(group='net.java.dev.jna', module='jna-platform', version='4.5.0')
)

import com.sun.jna.platform.unix.X11

def display = X11.INSTANCE.XOpenDisplay(null)
if(display == null) {
    throw new IllegalStateException('Can\'t open default display')
}
def root = X11.INSTANCE.XRootWindow(display, X11.INSTANCE.XDefaultScreen(display))
if(root == null) {
    throw new IllegalStateException('Can\'t find root window')
}


if(display != null) {
    X11.INSTANCE.XCloseDisplay(display)
}

这会导致以下异常

Caught: java.lang.UnsatisfiedLinkError: Unable to load library 'X11': Native library (linux-x86-64/libX11.so) not found in resource path ([file:/etc/user/john/.groovy/grapes/net.java.dev.jna/jna-platform/jars/jna-platform-4.5.0.jar, file:/etc/user/john/.groovy/grapes/net.java.dev.jna/jna/jars/jna-4.5.0.jar]) java.lang.UnsatisfiedLinkError: Unable to load library 'X11': Native library (linux-x86-64/libX11.so) not found in resource path ([file:/etc/user/john/.groovy/grapes/net.java.dev.jna/jna-platform/jars/jna-platform-4.5.0.jar, file:/etc/user/john/.groovy/grapes/net.java.dev.jna/jna/jars/jna-4.5.0.jar])
        at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:303)
        at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:427)
        at com.sun.jna.Library$Handler.<init>(Library.java:179)
        at com.sun.jna.Native.loadLibrary(Native.java:569)
        at com.sun.jna.Native.loadLibrary(Native.java:544)
        at com.sun.jna.platform.unix.X11.<clinit>(X11.java:417)
        at helloX11.run(helloX11:10)

如何在 nixos 上设置 jvm 以正确指向 libX11.so?

最佳答案

对于应该配置 X11 的 JVM 也会发生这种情况。看来 native 库不是通过 CLASSPATH 传播的。这可能应该在 NixPkgs 中得到修复。同时,您可以使用以下命令来使用 nix-shell 提供 native 包。

nix-shell -E 'with import <nixpkgs> { }; runCommand "dummy" { buildInputs = [ groovy ]; shellHook = "export CLASSPATH=${xlibs.libX11.out}/lib"; } ""' --run ./x11script.groovy

(nix-shell -E 使用来自虚拟派生的属性,这些属性是通过调用 runCommand 生成的)

如果您可以选择,您可以将虚拟派生放入名为 deps.nix 的文件中,并更改脚本的 hashbang 和第一行。

with import <nixpkgs> { };
runCommand "dummy" {
  buildInputs = [ groovy ];
  shellHook = "export CLASSPATH=${xlibs.libX11.out}/lib";
} ""

脚本顶部:

#!/usr/bin/env nix-shell
/*
#!nix-shell -i groovy
#!nix-shell deps.nix
*/

现在您可以调用脚本,而无需在命令行上手动调用 nix-shell

在我看来,使用 NixPkgs 的设置 Hook 机制可能有更好的解决方案,但遗憾的是我现在无法帮助您。

关于java - 无法在 nixos 上运行 groovy 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47946023/

相关文章:

bash - 如何使用 Groovy 执行带有反引号的 shell 命令?

c - 如何以编程方式检索附加到 Xorg 屏幕的图形适配器和显示器名称?

java - 仅限 map 的工作 - 订单

java - JFileChooser 关闭启动新窗口

json - Grails - JSON 绑定(bind)导致 JSONException

Groovy MarkupBuilder 名称冲突

c - 为什么 XDrawString 不采用 "const char *"?

bash - 我可以在 Cygwin 中使用类似 UNIX 的路径使用什么文件资源管理器?

java - 在struts中使用FormFile时如何获取完整的文件路径?

java - 从满足特定条件的列表中选择随机元素的最快方法