Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在tomcat根目录的web应用中找不到TransformerFactory_Java_Tomcat_Classloader - Fatal编程技术网

Java 在tomcat根目录的web应用中找不到TransformerFactory

Java 在tomcat根目录的web应用中找不到TransformerFactory,java,tomcat,classloader,Java,Tomcat,Classloader,我创建了一个web应用程序,它使用Saxon库进行XSLT转换。 当web应用程序使用自己的名称(等于webapps目录中的子目录名称)部署在Tomcat上时,此应用程序运行良好。 但是现在我已经更改了server.xml,将此web应用程序用作根应用程序,现在它无法加载Saxon库 我认为这与类装入器有关。我使用类装入器查找配置文件,当我将此应用程序设置为tomcat根应用程序时,配置文件也出现故障。我能够使用ServletContext加载配置文件,所以问题得到了解决 但现在我得到了以下错误

我创建了一个web应用程序,它使用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
所做的更改(我添加了
元素):


当使用
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"));