我的问题是我有一个ejb,它在内部使用freemarker工具生成一个HTML页面,构建并部署到JBoss EAP 6.4.10。当我尝试访问此功能(使用freemarker工具生成HTML代码)时,jboss会抛出以下错误:
java.lang.LinkageError:无法链接freemarker / core / TemplateElement 引起: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>
答案 0 :(得分:0)
Google App Engine存在同样的问题,即Java SE中必不可少的某些类不存在。因此,请尝试使用org.freemarker:freemarker-gae
代替普通org.freemarker:freemarker
。
更新:当然,JBoss EAP的类加载器不会出于某种原因导出javax.swing
包(请参阅注释)。虽然使用freemarker-gae工作,但是你必须小心地将来自其他地方的非gae FreeMarker排除为传递Maven(或Gradle等)依赖。因此,修改JBoss模块配置会更加可维护。我看到一些用-Djboss.modules.system.pkgs=javax.swing
启动JBoss EAP,但是如果Swing可用于同一JVM中的其他模块,那么必须有一个更优雅的解决方案,例如向deployment-structure.xml
添加内容,或者如果你定义你自己的JBoss模块然后到它的module.xml
。也许您应该检查哪个标准模块导出swing包(“javax.api”?),并尝试将该模块声明为依赖。
答案 1 :(得分:0)
最后发现错误是由于freemaker的module.xml文件中缺少依赖项'javax.api',在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>