FileNotFoundException:文件:xxx\.m2\repository\xxxx\xxxx\x



我有一个从eclplse构建的项目,还有一个java类,主方法运行良好,但当我尝试从IDEA运行它时却无法运行。

主方法最初将尝试通过ANOTHER依赖项目(wemq客户端)的以下代码从classbath加载属性文件:

filePath = this.getClass().getClassLoader().getResource(fileName).getPath();
....//something else
prop = new Properties();
prop.load(new FileInputStream(new File(filePath)));

但当我在InteliJ中运行时,我会出现以下错误:

Exception in thread "main" java.lang.ExceptionInInitializerError
at .....
Caused by: java.lang.RuntimeException: java.io.FileNotFoundException: file:C:Usersjaskeylin.m2repositorycnwebankwemqwemq-client.1.3wemq-client-0.1.3.jar!wemq-client.properties (文件名、目录名或卷标语法不正确。)

其中CCD_ 1表示文件名或字典名语法不正确。

我们可以从错误statck中看到,它试图从maven repo的包jar文件中找到这个文件。为什么?我该怎么修?

附言:如果你建议我修改代码,也请解释为什么这在eclipse中有效,因为这在我的团队中非常有效,只有我希望使用IDEA

从错误消息中的文件名可以看出,您正试图使用FileInputStream打开文件wemq-client-0.1.3.jar中的文件wemq-client.properties。你不能那样做。您只能打开文件系统上的真实文件,而不能打开档案中的文件。

简而言之,从不执行getResource(...).getPath()getResource(String)方法返回URL而不是File是有原因的。因为资源可能不是文件。

相反,使用getResourceAsStream(String),并将该文件名、目录名或卷标语法不正确。0直接赋给load(InputStream)方法。

和往常一样,记得关闭你的资源,最好使用"尝试使用资源"。

prop = new Properties();
try (InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(fileName)) {
prop.load(inputStream);
}

或者使用@SanjitKumarMishra在回答中建议的getResourceAsStream()的任何替代版本。

如果需要,可以使用getResource(String)方法,但必须使用URL.openStream()方法打开流。

URL fileUrl = this.getClass().getClassLoader().getResource(fileName);
....//something else
prop = new Properties();
try (InputStream inputStream = fileUrl.openStream()) {
prop.load(inputStream);
}

它在Eclipse中工作的原因是,您直接在文件系统上的文件外运行,然而,当您打包和部署代码时,它被打包在jar文件中,您会看到错误。

您不能使用FileInputStream读取jar中的文件,您可以使用someclass.class.getResourceAsStream(name)读取文件

prop = new Properties();
prop.load(this.getClass().getResourceAsStream(fileName));

如果从应用程序服务器加载类,则应使用Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName)而不是this.getClass().getClassLoader().getResourceAsStream(fileName)this.getClass().getResourceAsStream()也将起作用。

阅读这篇文章,了解有关该特定问题的更多详细信息。

您可以使用HTTPSERVERREQUEST来获取文件路径。

HttpServlet请求=Servlet ActionContext.getRequest()

字符串filePath=request.getSession().getServlet上下文().get-RealPath("/")+文件名

最新更新