【问题标题】:Cannot run groovy script on nixos无法在 nixos 上运行 groovy 脚本
【发布时间】:2018-06-05 08:58:45
【问题描述】:

我正在尝试从 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?

【问题讨论】:

    标签: java groovy x11 nixos


    【解决方案1】:

    这也发生在应该使用 X11 配置的 JVM 上。似乎本机库不是通过CLASSPATH 传播的。这可能应该在 NixPkgs 中修复。同时,您可以使用以下内容通过nix-shell 使本机包可用。

    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 的设置挂钩机制可能会获得更好的解决方案,但遗憾的是,我现在无法为您提供帮助。

    【讨论】:

      猜你喜欢
      • 2022-01-22
      • 2013-01-31
      • 2021-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多