0

我正在从我的 Tibco 进程中调用一个 java 类的方法。此类使用 DocumentBuilderFactroy 抽象类。

DocumentBuilderFactroy documentBuilderFactroy = DocumentBuilderFactroy.neInstance ();

当我在 Eclipse 中本地运行应用程序时,一切正常。但是在部署模式下,我有以下错误:

无法创建 javax.xml.parsers.DocumentBuilderFactory 的提供程序。

所以我通过指定实现类,改变了代码中实例化documentBuilderFactroy对象的方式。

String providerDBF = "com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl";
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance (providerDBF, null);

我的问题是:如何在不硬编码的情况下指定实现类以避免该问题?

我没有使用 Maven。

谢谢。

4

2 回答 2

1

您可以在目录中使用javax.xml.parsers.DocumentBuilderFactory system property或。properties fileJRE

DocumentBuilderFactory 文档

public static DocumentBuilderFactory newInstance()

获取 DocumentBuilderFactory 的新实例。这个静态方法创建一个新的工厂实例。此方法使用以下有序查找过程来确定要加载的 DocumentBuilderFactory 实现类:

  • 使用 javax.xml.parsers.DocumentBuilderFactory 系统属性。
  • 使用 JRE 目录中的属性文件“lib/jaxp.properties”。此配置文件采用标准 java.util.Properties 格式,包含实现类的完全限定名称,键是上面定义的系统属性。JAXP 实现只读取一次 jaxp.properties 文件,然后缓存它的值以供将来使用。如果在第一次尝试读取文件时文件不存在,则不会进一步尝试检查其是否存在。第一次读取 jaxp.properties 中的任何属性的值后,便无法更改它的值。
  • 如果可用,请使用服务 API(如 JAR 规范中所述)来确定类名。服务 API 将在运行时可用的 jar 中的 META-INF/services/javax.xml.parsers.DocumentBuilderFactory 文件中查找类名。
  • 平台默认 DocumentBuilderFactory 实例。一旦应用程序获得了对 DocumentBuilderFactory 的引用,它就可以使用工厂来配置和获取解析器实例。
于 2017-08-11T14:41:08.017 回答
0

JavaDocs状态,在哪里可以设置:

此方法使用以下有序查找过程来确定要加载的 DocumentBuilderFactory 实现类:

  • 使用 javax.xml.parsers.DocumentBuilderFactory 系统属性。
  • 使用 JRE 目录中的属性文件“lib/jaxp.properties”。此配置文件采用标准 java.util.Properties 格式,包含实现类的完全限定名称,键是上面定义的系统属性。JAXP 实现只读取一次 jaxp.properties 文件,然后缓存它的值以供将来使用。如果在第一次尝试读取文件时文件不存在,则不会进一步尝试检查其是否存在。第一次读取 jaxp.properties 中的任何属性的值后,便无法更改它的值。
  • 使用由 ServiceLoader 类定义的服务提供者加载工具来尝试使用默认加载机制来定位和加载服务的实现:服务提供者加载工具将使用当前线程的上下文类加载器来尝试加载服务。如果上下文类加载器为空,将使用系统类加载器。
  • 否则,返回系统默认实现。
于 2017-08-11T14:39:13.190 回答