Java 在tomcat根目录的web应用中找不到TransformerFactory
我创建了一个web应用程序,它使用Saxon库进行XSLT转换。 当web应用程序使用自己的名称(等于webapps目录中的子目录名称)部署在Tomcat上时,此应用程序运行良好。 但是现在我已经更改了Java 在tomcat根目录的web应用中找不到TransformerFactory,java,tomcat,classloader,Java,Tomcat,Classloader,我创建了一个web应用程序,它使用Saxon库进行XSLT转换。 当web应用程序使用自己的名称(等于webapps目录中的子目录名称)部署在Tomcat上时,此应用程序运行良好。 但是现在我已经更改了server.xml,将此web应用程序用作根应用程序,现在它无法加载Saxon库 我认为这与类装入器有关。我使用类装入器查找配置文件,当我将此应用程序设置为tomcat根应用程序时,配置文件也出现故障。我能够使用ServletContext加载配置文件,所以问题得到了解决 但现在我得到了以下错误
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
所做的更改(我添加了
元素):
当使用newInstance
方法中的类名创建TransformerFactory
时,tomcat似乎找不到SAXON库
我可以通过编程方式将目录(web应用程序中的lib目录)添加到类路径吗?或者我应该将SAXON库添加到tomcat在其类路径中使用的另一个目录(哪个?)?我可以直接创建一个Saxon
TransformerFactory
(没有类装入器)吗?或者我将此应用程序配置为根应用程序的配置是错误的?我通过编程方式将tomcat webapp中的lib目录添加到类加载器中,使其正常工作
老实说,我对这个解决方案不是很满意,但它很有效
必须按照中所述静态添加路径。这是我的foodvocadpplication
类中的一个静态方法
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()});
}
其中
webInff
是指向webapp中WEB-INF目录的文件对象。SAXON库最初位于哪里?在web应用程序的web inf/lib中?是的,在webapps/foodvoc pipelines/web-inf/lib/以及它能够找到的一系列其他库中。
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"));