Apache Karaf(可能 java)在不同服务器上的不同行为
Different behavior of Apache Karaf (maybe java) on different servers
我在一台服务器 (Server1) 上遇到错误(见下文),但在另一台服务器 (Server2) 上没有。
代码如下:
GregorianCalendar c = new GregorianCalendar();
c.setTime(rs.getDate("claimDate"));
XMLGregorianCalendar date2 =
DatatypeFactory.newInstance().newXMLGregorianCalendar(c);
这是错误:
Caused by: java.lang.NoSuchMethodError: javax.xml.datatype.FactoryFinder.find(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Object;
at javax.xml.datatype.DatatypeFactory.newInstance(DatatypeFactory.java:49) ~[?:?]
Java 版本相同(build 1.8.0_92-b14)。
我使用了一个自定义的 Karaf 发行版 (https://karaf.apache.org/manual/latest/#_custom_distributions),我将其部署在两台不同的服务器上(不同的物理机器和 Ubuntu 版本)。
Server1: Linux karaf1 2.6.32-358.el6.x86_64 #1 SMP Fri Feb 22 00:31:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
Server2:Linux newproger 3.13.0-142-generic #191-Ubuntu SMP Fri Feb 2 12:13:35 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
启动脚本和java参数都一样。
可能 karaf 认可的 lib 文件夹 (apache-karaf-x.x.x/lib/endorsed
) 中的某些 jar 文件正在覆盖 javax.xml.datatype.FactoryFinder
class(来自 rt.jar)。
如果您在程序集 pom 中使用 <libraries>
标签(在 karaf-maven-plugin 中)- 尝试找到包含 javax.xml.datatype
包的 jar(在我的例子中是 - org.apache.servicemix.specs.jaxp-api
) 并将其删除。在下面的示例中可以找到它:
<plugin>
<groupId>org.apache.karaf.tooling</groupId>
<artifactId>karaf-maven-plugin</artifactId>
<version>${karaf.version}</version>
<configuration>
<startupFeatures>
<feature>eventadmin</feature>
</startupFeatures>
<installedFeatures>
<feature>wrapper</feature>
</installedFeatures>
<bootFeatures>
<!-- karaf standard -->
<feature>jaas</feature>
<feature>wrap</feature>
(...)
<feature>hibernate</feature>
<feature>transaction</feature>
<feature>jpa</feature>
</bootFeatures>
<libraries>
</libraries>
<javase>${java.version}</javase>
</configuration>
</plugin>
我在一台服务器 (Server1) 上遇到错误(见下文),但在另一台服务器 (Server2) 上没有。
代码如下:
GregorianCalendar c = new GregorianCalendar();
c.setTime(rs.getDate("claimDate"));
XMLGregorianCalendar date2 =
DatatypeFactory.newInstance().newXMLGregorianCalendar(c);
这是错误:
Caused by: java.lang.NoSuchMethodError: javax.xml.datatype.FactoryFinder.find(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Object;
at javax.xml.datatype.DatatypeFactory.newInstance(DatatypeFactory.java:49) ~[?:?]
Java 版本相同(build 1.8.0_92-b14)。
我使用了一个自定义的 Karaf 发行版 (https://karaf.apache.org/manual/latest/#_custom_distributions),我将其部署在两台不同的服务器上(不同的物理机器和 Ubuntu 版本)。
Server1: Linux karaf1 2.6.32-358.el6.x86_64 #1 SMP Fri Feb 22 00:31:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
Server2:Linux newproger 3.13.0-142-generic #191-Ubuntu SMP Fri Feb 2 12:13:35 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
启动脚本和java参数都一样。
可能 karaf 认可的 lib 文件夹 (apache-karaf-x.x.x/lib/endorsed
) 中的某些 jar 文件正在覆盖 javax.xml.datatype.FactoryFinder
class(来自 rt.jar)。
如果您在程序集 pom 中使用 <libraries>
标签(在 karaf-maven-plugin 中)- 尝试找到包含 javax.xml.datatype
包的 jar(在我的例子中是 - org.apache.servicemix.specs.jaxp-api
) 并将其删除。在下面的示例中可以找到它:
<plugin>
<groupId>org.apache.karaf.tooling</groupId>
<artifactId>karaf-maven-plugin</artifactId>
<version>${karaf.version}</version>
<configuration>
<startupFeatures>
<feature>eventadmin</feature>
</startupFeatures>
<installedFeatures>
<feature>wrapper</feature>
</installedFeatures>
<bootFeatures>
<!-- karaf standard -->
<feature>jaas</feature>
<feature>wrap</feature>
(...)
<feature>hibernate</feature>
<feature>transaction</feature>
<feature>jpa</feature>
</bootFeatures>
<libraries>
</libraries>
<javase>${java.version}</javase>
</configuration>
</plugin>