运行 JWS Swing 应用程序时出现“java.lang.UnsatisfiedLinkError:java.library.path 中没有 awt”

Seb*_*iot 5 java swing awt apache-fop

我们有时会从客户那里收到这个奇怪的错误(自动地,直到现在还没有填写用户报告),我们没有人能理解它。用户在 Win7 机器上启动我们的 Swing Java-Web-Start“胖客户端”,最终使用一些应该生成 PDF 文档的操作(使用古老的、修改过的 Apache FOP 版本),最终得到这个错误。到目前为止,它在我们这边是不可复制的。谷歌也没有帮助解决这个问题。

最大的问题是,当需要 awt dll 来激活导致错误的操作时怎么会缺少 awt dll?

有什么东西可以卸载awt dll吗?堆栈跟踪几乎总是相同的,我们没有发现任何其他错误的证据。这可能是未记录的先前本机错误的结果吗?

编辑:PDF 生成在后台线程中运行,而阻塞的“等待”对话框可防止用户关闭或以其他方式操作 UI。

java.lang.UnsatisfiedLinkError: no awt in java.library.path
    at java.lang.ClassLoader.loadLibrary
    at java.lang.Runtime.loadLibrary0
    at java.lang.System.loadLibrary
    at sun.java2d.cmm.lcms.LCMS$1.run
    at java.security.AccessController.doPrivileged
    at sun.java2d.cmm.lcms.LCMS.getModule
    at sun.java2d.cmm.lcms.LcmsServiceProvider.getModule
    at sun.java2d.cmm.CMMServiceProvider.getColorManagementModule
    at sun.java2d.cmm.CMSManager.getModule
    at java.awt.color.ICC_Profile.getInstance
    at java.awt.color.ICC_Profile.getInstance
    at org.apache.fop.pdf.PDFICCBasedColorSpace.setupsRGBColorProfile
    at org.apache.fop.pdf.PDFICCBasedColorSpace.setupsRGBAsDefaultRGBColorSpace
    at org.apache.fop.render.pdf.PDFRenderingUtil.addsRGBColorSpace
    at org.apache.fop.render.pdf.PDFRenderingUtil.setupPDFDocument
    at org.apache.fop.render.pdf.PDFDocumentHandler.startDocument
    at org.apache.fop.render.intermediate.IFRenderer.startRenderer
    at org.apache.fop.area.RenderPagesModel
    at org.apache.fop.area.AreaTreeHandler.setupModel
    at org.apache.fop.area.AreaTreeHandler
    at org.apache.fop.render.RendererFactory.createFOEventHandler
    at org.apache.fop.fo.FOTreeBuilder
    at org.apache.fop.apps.Fop.createDefaultHandler
    at org.apache.fop.apps.Fop
    at org.apache.fop.apps.FopFactory.newFop
    at org.apache.fop.apps.FopFactory.newFop
    at ...
    at javax.swing.SwingWorker$1.call
    at java.util.concurrent.FutureTask.run
    at javax.swing.SwingWorker.run
    at ...
    at java.util.concurrent.ThreadPoolExecutor.runWorker
    at java.util.concurrent.ThreadPoolExecutor$Worker.run
    at java.lang.Thread.run
Run Code Online (Sandbox Code Playgroud)

编辑:我找到了导致错误的代码(在 grepcode.com 中):

/* the class initializer which loads the CMM */
static {
    java.security.AccessController.doPrivileged(
        new java.security.PrivilegedAction() {
            public Object run() {
                /* We need to load awt here because of usage trace and
                 * disposer frameworks
                 */
                System.loadLibrary("awt"); // HERE!
                System.loadLibrary("lcms");
                return null;
            }
        }
    );
// ...
}
Run Code Online (Sandbox Code Playgroud)

Pix*_*tix 8

这可能不是OP错误的原因,但这对于其他因其他原因而出现相同错误的人来说是这样的。

如果在应用程序仍在运行时 Java 运行时环境的版本更新,则可能会发生此错误;例如,如果它是通过 Windows 上的 MSI/EXE 安装程序或 yum/apt-get/etc 进行更新的。在 *nix 上。更新后,正在运行的 Java 应用程序正在查找的 DLL (Windows) 或 SO (Linux/Unix) 可能在它所知道的位置不再可用,因此找不到它。

在类 Unix 环境中,文件锁不一定能防止文件删除,而在服务器上,长时间运行的服务只需要偶尔依赖这些 DLL 的特定功能,这种情况更有可能发生。

在这种情况下,需要重新启动应用程序。