无法在 nixos 上 运行 groovy 脚本
Cannot run groovy script on nixos
我正在尝试 运行 这个来自 nixosgroovy 的脚本
#!/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 上。似乎原生库没有通过 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 的设置挂钩机制可能会有更好的解决方案,但遗憾的是,我现在无法为您提供帮助。
我正在尝试 运行 这个来自 nixosgroovy 的脚本
#!/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 上。似乎原生库没有通过 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 的设置挂钩机制可能会有更好的解决方案,但遗憾的是,我现在无法为您提供帮助。