Java-ImageJ中的HeadlessException

Java-ImageJ中的HeadlessException,java,exception-handling,headless,imagej,Java,Exception Handling,Headless,Imagej,我在ImageJ中编写了一个宏,用于在JPEG图像文件列表上运行“测量”。我使用headless.jar在远程linux机器上以headless模式运行代码 我有以下理由: > java.awt.HeadlessException: No X11 DISPLAY variable was set, but this > program performed an operation which requires it. > at java.awt.Graphic

我在ImageJ中编写了一个宏,用于在JPEG图像文件列表上运行“测量”。我使用headless.jar在远程linux机器上以headless模式运行代码

我有以下理由:

> java.awt.HeadlessException:  No X11 DISPLAY variable was set, but this
> program performed an operation which requires it.
>         at java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:159)
>         at java.awt.Window.<init>(Window.java:433)
>         at java.awt.Frame.<init>(Frame.java:403)
>         at ij.plugin.frame.PlugInFrame.<init>(PlugInFrame.java:13)
>         at ij.plugin.frame.Editor.<init>(Editor.java:89)
>         at ij.plugin.frame.Editor.<init>(Editor.java:85)
>         at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
>         at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
>         at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
>         at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
>         at java.lang.Class.newInstance0(Class.java:355)
>         at java.lang.Class.newInstance(Class.java:308)
>         at ij.IJ.runPlugIn(IJ.java:156)
>         at ij.IJ.runPlugIn(IJ.java:141)
>         at ij.io.Opener.open(Opener.java:172)
>         at ij.IJ.open(IJ.java:1505)
>         at ij.macro.Functions.open(Functions.java:2325)
>         at ij.macro.Functions.doFunction(Functions.java:141)
>java.awt.HeadlessException:未设置X11显示变量,但
>程序执行了需要它的操作。
>位于java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:159)
>在java.awt.Window(Window.java:433)
>在java.awt.Frame.(Frame.java:403)
>在ij.plugin.frame.PlugInFrame.(PlugInFrame.java:13)
>位于ij.plugin.frame.Editor(Editor.java:89)
>位于ij.plugin.frame.Editor(Editor.java:85)
>位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
>位于sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
>在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
>位于java.lang.reflect.Constructor.newInstance(Constructor.java:513)
>位于java.lang.Class.newInstance0(Class.java:355)
>位于java.lang.Class.newInstance(Class.java:308)
>在ij.ij.runPlugIn(ij.java:156)
>在ij.ij.runPlugIn(ij.java:141)
>在ij.io.Opener.open(Opener.java:172)
>在ij.ij.open(ij.java:1505)
>打开(Functions.java:2325)
>在ij.macro.Functions.doFunction(Functions.java:141)

我如何覆盖这个?有没有办法阻止ImageJ打开图形环境?

不是ImageJ方面的专家,但看起来有一个IJ插件正在创建其用户界面,尽管整个事情都处于无头模式(因此问题不是来自IJ本身)。找到并修补插件,使其在无头模式下正常运行可能会很麻烦

有一种解决方案适用于任何坚持打开UI但可以通过宏使用的应用程序:提供虚拟帧缓冲区(使用
xvfb
),并使其成为应用程序使用的显示


只要没有任何东西阻止用户输入,这应该可以工作。下面是一些使用ImageJ执行此操作的方法。这是针对斐济的,一个衍生项目,但它展示了一个可能的解决方案,使用
xvfb
,它也应该与IJ本身一起工作。

感谢您的回答。如果读取/加载一个图像时遇到错误,您知道如何强制imagej继续从图像列表中读取吗?ImageJ在遇到错误时停止进程!这可能是另一个可以发布到SO的好问题;)。不幸的是,正如我所说,我不是ImageJ专家——我只是提供了一个通用的解决方案,可以用于任何程序。如果没有其他帮助,您可以简单地对发生错误的事实作出反应,并使用缩短的列表(删除错误的图像)重新启动ImageJ。