java.lang.LinkageError: Failed to link freemarker/core/TemplateElement

java.lang.LinkageError: Failed to link freemarker/core/TemplateElement

我的问题是我有一个 ejb,它在内部使用 freemarker 工具生成 HTML 页面,构建并部署到 JBoss EAP 6.4.10。当我尝试访问此功能(使用 freemarker 工具生成 HTML 代码)时,jboss 抛出以下错误:

java.lang.LinkageError: Failed to link freemarker/core/TemplateElement Caused by: java.lang.NoClassDefFoundError: javax/swing/tree/TreeNode

我在我的 jboss 模块中添加了 freemarker jar,它 module.xml 看起来像这样:

<module xmlns="urn:jboss:module:1.1" name="org.freemarker">
<resources>
    <resource-root path="freemarker-2.3.25.jar"/>
</resources>

<dependencies>
</dependencies>
</module>

Google App Engine 也有同样的问题,Java SE 中的某些 classes 是强制性的。所以尝试使用 org.freemarker:freemarker-gae 而不是普通的 org.freemarker:freemarker.

这到底是个什么平台,为什么class不见了?是 Google App Engine 吗?

更新:当然 JBoss EAP 的 class 加载程序出于某种原因不会导出 javax.swing 包(请参阅评论)。当使用 freemarker-gae 解决这个问题时,您必须小心排除来自其他地方的非 gae FreeMarker-s 作为传递 Maven(或 Gradle 等)依赖项。因此,改为修复 JBoss 模块配置会更易于维护。我看到一些用 -Djboss.modules.system.pkgs=javax.swing 启动 JBoss EAP,但如果 Swing 可用于同一 JVM 中的其他模块,那么必须有一个更优雅的解决方案,例如向 deployment-structure.xml 添加一些东西,或者,如果您定义了自己的 JBoss 模块,那么它的 module.xml。也许您应该检查哪个标准模块导出了 swing 包("javax.api"?),并尝试将该模块声明为依赖项。

最后发现错误是由于freemaker的module.xml文件中缺少依赖项'javax.api',在module.xml中添加依赖项后问题解决了module.xml。

<module xmlns="urn:jboss:module:1.1" name="org.freemarker">
<resources>
    <resource-root path="freemarker-2.3.25.jar"/>
</resources>

<dependencies>
    <module name="javax.api"/>
</dependencies>