FileNotFoundException:file:xxx \ .m2 \ repository \ xxxx \ xxx \ xxx.jar!\ filename,当从IDEA

时间:2016-06-01 05:02:14

标签: java eclipse maven intellij-idea

我有一个从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

4 个答案:

答案 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;