Jakarta ee 从servlet在jar中运行类时FileNotFoundException

Jakarta ee 从servlet在jar中运行类时FileNotFoundException,jakarta-ee,servlets,filenotfoundexception,Jakarta Ee,Servlets,Filenotfoundexception,在eclipse IDE中,有一个独立的java应用程序可以读取文件。这些文件都位于项目下的一个文件夹中。 我创建了另一个web应用程序,编写了一个servlet,并在web_INF/lib中添加了上述应用程序的jar文件,以便我可以使用其中的所有类。servlet非常简单,但java应用程序无法像以前一样读取文件。我得到了java.io.FileNotFoundException(系统无法找到指定的路径)。 我检查了jar文件,它包含了包含要读取的文件的文件夹。我甚至尝试在TOMCAT中将该文

在eclipse IDE中,有一个独立的java应用程序可以读取文件。这些文件都位于项目下的一个文件夹中。
我创建了另一个web应用程序,编写了一个servlet,并在web_INF/lib中添加了上述应用程序的jar文件,以便我可以使用其中的所有类。servlet非常简单,但java应用程序无法像以前一样读取文件。我得到了java.io.FileNotFoundException(系统无法找到指定的路径)。
我检查了jar文件,它包含了包含要读取的文件的文件夹。我甚至尝试在TOMCAT中将该文件夹添加到类路径中。但我仍然无法摆脱这个错误。有人能告诉我是怎么回事吗

我得到错误的地方

public class KnowledgeSummaryServlet extends HttpServlet {

Answerer a = new Answerer();
课堂答疑员是这样的

public class Answerer {
Lookup lvg  = new Lookup("resources/test/xyz", "resources/test/test.txt");
这是运行servlet后的错误跟踪

java.io.FileNotFoundException: resources\test\xyz (The system cannot              
find the path specified)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at java.util.Scanner.<init>(Scanner.java:656)
at com.Lookup.localInitialize(Lookup.java:49)
at com.Lookup.<init>(Lookup.java:44)
at com.Answerer.<init>(Answerer.java:27)
at com.web.KnowledgeSummaryServlet.<init>(KnowledgeSummaryServlet.java:20)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
at java.lang.Class.newInstance0(Class.java:372)
at java.lang.Class.newInstance(Class.java:325)
at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:119)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1048)
at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:799)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:135)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:108)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:558)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:379)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:259)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:281)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
java.io.FileNotFoundException:resources\test\xyz(系统无法
查找指定的路径)
在java.io.FileInputStream.open(本机方法)
位于java.io.FileInputStream。(FileInputStream.java:138)
位于java.util.Scanner.(Scanner.java:656)
在com.Lookup.localInitialize(Lookup.java:49)
在com.Lookup.(Lookup.java:44)
在com.Answerer.(Answerer.java:27)
位于com.web.KnowledgeSummaryServlet。(KnowledgeSummaryServlet.java:20)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
位于java.lang.reflect.Constructor.newInstance(Constructor.java:525)
位于java.lang.Class.newInstance0(Class.java:372)
位于java.lang.Class.newInstance(Class.java:325)
位于org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:119)
位于org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1048)
位于org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:799)
位于org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:135)
位于org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161)
位于org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
位于org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:108)
位于org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:558)
位于org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
位于org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:379)
位于org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243)
位于org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:259)
位于org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:281)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
运行(Thread.java:722)

您不应该使用
FileInputStream
获取类路径资源作为本地磁盘文件系统资源。这毫无意义。使用
ClassLoader
获取类路径资源作为类路径资源

假设您在一个servlet中,并且假设
/resources
文件夹是类路径的一部分,只需按如下方式获取它们:

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream xyzInput = classLoader.getResourceAsStream("test/xyz");
InputStream txtInput = classLoader.getResourceAsStream("test/test.txt");
// ...

非常奇怪的是,在从类路径读取资源时,会出现
FileNotFoundException
。这表明您正试图通过本地磁盘文件系统方式而不是通过类路径方式来访问类路径资源,这毫无意义。您能否编辑您的问题以显示您尝试的代码并粘贴整个stacktrace?谢谢,这很有效。但在将来部署时,有没有一种方法可以让事情正常进行,而无需将文件夹添加到类路径中?文件夹不能从java应用程序的jar文件中提取?类路径还覆盖所有jar。