我有一个从eclplse构建的项目,以及一个主类方法运行良好的java类,但是当我尝试从IDEA运行它时无法运行。
主方法最初会尝试通过以下来自另一个依赖项目(wemq-client)的代码从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:\Users\jaskeylin\.m2\repository\cn\webank\wemq\wemq-client\0.1.3\wemq-client-0.1.3.jar!\wemq-client.properties (文件名、目录名或卷标语法不正确。)
文件名、目录名或卷标语法不正确。
表示文件名或字典名称语法不正确。
我们可以从错误statck中看到它试图从maven repo的包jar文件中找到这个文件。这是为什么?我该如何解决呢?
PS:如果你建议我修改代码,请解释为什么这可以从eclipse中解决,因为这对我的同伴来说效果很好,只有我希望使用IDEA答案 0 :(得分:1)
正如您从错误消息中的文件名中看到的那样,您正尝试使用wemq-client.properties
在文件wemq-client-0.1.3.jar
内打开文件FileInputStream
。你不能这样做。您只能在文件系统上打开真实文件,而不能在档案中打开文件。
简而言之,永远不会做getResource(...).getPath()
。 getResource(String)
方法返回URL
而不是File
是有原因的。因为资源可能不是 文件。
相反,请使用getResourceAsStream(String)
,并将InputStream
直接提供给load(InputStream)
方法。
与往常一样,请务必关闭资源,最好使用try-with-resources。
prop = new Properties();
try (InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(fileName)) {
prop.load(inputStream);
}
或按照answer by @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文件中,你就会得到错误你看。
答案 1 :(得分:0)
你不能使用FileInputStream来读取jar中的文件,你可以使用someclass.class.getResourceAsStream(name)
来读取文件
刚
prop = new Properties();
prop.load(this.getClass().getResourceAsStream(fileName));
答案 2 :(得分:0)
如果要从Application Server加载类,那么您应该使用 Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName)
而不是this.getClass().getClassLoader().getResourceAsStream(fileName)
。 this.getClass().getResourceAsStream()
也可以使用。
阅读this article以获取有关该特定问题的更多详细信息。
答案 3 :(得分:-1)
您可以使用HTTPSERVLETREQUEST获取文件路径。
HttpServletRequest request = ServletActionContext.getRequest();
String filePath = request.getSession()。getServletContext()。getRealPath(“/”)+ filename;