gpt4 book ai didi

java - 在 tomcat root 的 Web 应用程序中找不到 TransformerFactory

转载 作者:行者123 更新时间:2023-11-28 23:32:49 25 4
gpt4 key购买 nike

我创建了一个网络应用程序,它使用 Saxon 库进行 XSLT 转换。当 Web 应用程序使用自己的名称(等于 webapps 目录中的子目录的名称)部署在 Tomcat 上时,此应用程序运行良好。但是现在我改了server.xml将此 Web 应用程序用作根应用程序,现在它无法加载 Saxon 库。

我认为这与类加载器有关。我使用类加载器查找配置文件,当我将此应用程序设置为 tomcat 根应用程序时,这些配置文件也崩溃了。我能够使用 ServletContext 加载配置文件,这样问题就解决了。

但现在我得到以下错误:

Caused by: javax.xml.transform.TransformerFactoryConfigurationError: Provider net.sf.saxon.TransformerFactoryImpl not found

调用时使用:

TransformerFactory tf = TransformerFactory.newInstance("net.sf.saxon.TransformerFactoryImpl",null);

我对 server.xml 所做的更改(我添加了 <Context> 元素):

  <Host name="localhost"  appBase="webapps"
unpackWARs="true" autoDeploy="true">

<!-- SingleSignOn valve, share authentication between web applications
Documentation at: /docs/config/valve.html -->
<!--
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
-->

<!-- Access log processes all example.
Documentation at: /docs/config/valve.html
Note: The pattern used is equivalent to using pattern="common" -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t &quot;%r&quot; %s %b" />
<Context docBase="foodvoc-pipelines" path="/" reloadable="true"/>
</Host>

似乎tomcat 在TransformerFactory 时找不到SAXON 库。使用 newInstance 中的类名创建方法。

我可以通过编程方式将目录(Web 应用程序中的 lib 目录)添加到类路径吗?或者我应该将 SAXON 库添加到 tomcat 在其类路径中使用的另一个目录(哪个?)?我可以创建撒克逊人吗 TransformerFactory直接(没有类加载器)?还是我将此应用程序设置为根应用程序的配置有误?

最佳答案

我能够通过以编程方式将 tomcat webapp 中的 lib 目录添加到类加载器来实现这一点。

老实说,我对这个解决方案不是很满意,但它确实有效...

路径必须按照 answer to this question 中的描述静态添加.这是我的 FoodVocApplication 类中的一个静态方法。

private static void addPath(File file) throws NoSuchMethodException, MalformedURLException, InvocationTargetException, IllegalAccessException {
URI u = file.toURI();
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
Class<URLClassLoader> urlclass = URLClassLoader.class;
Method method = urlclass.getDeclaredMethod("addURL", new Class[]{URL.class});
method.setAccessible(true);
method.invoke(classLoader, new Object[]{u.toURL()});
}

然后可以在初始化期间调用此方法:

FoodVocApplication.addPath(new File(webInff, "lib"));

其中 webInff 是一个 File 对象,指向 webapp 中的 WEB-INF 目录。

关于java - 在 tomcat root 的 Web 应用程序中找不到 TransformerFactory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28194374/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com