带有JAX-RS / JAXB和JDK 11版本的Liferay 7.2

时间:2019-08-06 19:57:18

标签: jaxb jax-rs java-11 liferay-7

我有created a Liferay Blade "rest" module以及该模板随附的示例代码。我试图在以下位置访问示例代码的/ greetings端点:http://localhost:8080/o/greetings

我收到的错误似乎很常见,well-documented是因为在Java 11中,JAX已完全从JDK中完全删除:

JAXBException发生:在模块路径或类路径上找不到JAXB-API的实现。org.apache.aries.jax无法找到com.sun.xml.internal.bind.v2.ContextFactory。 rs.whiteboard_1.0.4

该模块使用gradle构建并部署到Liferay 7.2中,没有任何错误,suggested solutions并没有解决错误(显然)。

完全公开,我不是Java开发人员,因此显然缺乏对Java的非常基本的了解,这可能是导致该问题的原因。

我尝试将建议的依赖项包括到我的gradle.build文件中:

dynamic_rnn

我还尝试过将上述依赖项的jar文件下载并部署到Liferay 7.2中。没有运气。

我的gradle.build文件:

compile('javax.xml.bind:jaxb-api:2.3.0')
compile('javax.activation:activation:1.1')
compile('org.glassfish.jaxb:jaxb-runtime:2.3.0')

示例类文件:

dependencies {
    compileOnly group: "javax.ws.rs", name: "javax.ws.rs-api", version: "2.1"
    compileOnly group: "org.osgi", name: "org.osgi.service.component.annotations", version: "1.3.0"
    compileOnly group: "org.osgi", name: "org.osgi.service.jaxrs", version: "1.0.0"
    compileOnly group: "com.liferay.portal", name: "com.liferay.portal.kernel", version: "4.4.0"

}

我追求的预期结果是在指定样本的端点接收样本消息。

任何来自这个美好社区的帮助将不胜感激!

更新

我在机器上切换到Java 9 JDK。我仍然遇到上述错误消息。

3 个答案:

答案 0 :(得分:0)

Liferay社区的Jorge Diaz刚刚在Liferay论坛上回复说,这看起来像是一个正在解决的现有bug。

https://issues.liferay.com/browse/LPS-92576 https://issues.liferay.com/browse/LPS-97968

无论如何,我通过将Java降级到有效的Java 8来确认Liferay与Java 9和11的组合不能很好地与JAXB配合使用。

答案 1 :(得分:0)

Liferay在产品中附带了JAXB的实现。我们只需要配置JVM来寻找它,而不是尝试寻找默认的旧JVM。

只需设置属性javax.xml.bind.JAXBContextFactory=com.sun.xml.bind.v2.ContextFactory即可。您应该能够在启动Liferay的JVM的环境或可执行文件上进行设置。

如果Liferay的更高版本,则应默认设置。

答案 2 :(得分:0)

Carlos Sierra提供的解决方案有效。添加

-Djavax.xml.bind.JAXBContextFactory=com.sun.xml.bind.v2.ContextFactory 

VM参数列表以指向Liferay提供的ContextFactory实现。

环境:带有Liferay DXP 7.2.10 GA1 SP 2(dxp-2-7210)的openjdk版本“ 11.0.5”于2019-10-15