我有一个从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("/")+文件名