[java]打包成jar之后找不到文件FileNotFoundException

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[java]打包成jar之后找不到文件FileNotFoundException相关的知识,希望对你有一定的参考价值。

jar包放在c盘命名为Test.jar,以压缩方式打开的话,可以看到文件夹A中有B.xxx(一个可以读的excel文件)[在eclipse里面运行是没有任何问题的]
但是做成jar包之后异常提示

file:\C:\Test.jar!\A\B.xxx<文件名、目录名或卷标语法不正确>
是不是这个路径语法有问题?
我是用的
getClass().getResource("/A/B.xxx");
获得的路径

参考技术A Java在WEB项目中获取文件路径 .

jsp中获得文件路径servlet中获得文件路径java中获得文件路径jsp中获得文件路径
1、根目录所对应的绝对路径:request.getRequestURI();
2、文件的绝对路径:application.getRealPath(request.getRequestURI())
3、当前web应用的绝对路径:application.getRealPath("/")
4、取得请求文件的上层目录:
newFile(application.getRealPath(request.getRequestURI())).getParent()
servlet中获得文件路径
1、根目录所对应的绝对路径:request.getServletPath()
2、文件的绝对路径:
request.getSession().getServletContext().getRealPath(request.getRequestURI())
3、当前web应用的绝对路径:servletConfig.getServletContext().getRealPath("/")
注:ServletContext对象获得几种方式:
javax.servlet.http.HttpSession.getServletContext()
javax.servlet.jsp.PageContext.getServletContext()
javax.servlet.ServletConfig.getServletContext()
java中获得文件路径
1、Thread.currentThread().getContextClassLoader().getResource("").toURI().getPath()
2、MyClass.class.getClassLoader().getResource("").toURI().getPath()
3、ClassLoader.getSystemResource("").toURI().getPath()
4、MyClass.class.getResource("").toURI().getPath()
5、MyClass.class.getResource("/").toURI().getPath()
6、newFile("/").getAbsolutePath().toURI().getPath()
7、System.getProperty("user.dir").toURI().getPath()

希望能帮到你本回答被提问者采纳

spring boot打包后找不到资源文件

【中文标题】spring boot打包后找不到资源文件【英文标题】:Spring boot can not find resource file after packaging 【发布时间】:2019-05-31 21:23:03 【问题描述】:

我使用 Spring boot maven 插件将应用程序打包为 jar 文件。

在Itellij IDE中可以找到直接运行的资源文件, 但是之后找不到资源文件,显示错误为:

java.io.FileNotFoundException: 类路径资源 [jmxremote.password] 无法解析为绝对文件路径,因为它不驻留在文件系统中:jar:file:/home/XXX/target/YYY.jar!/ BOOT-INF/classes!/jmxremote.password

但是,jar文件中确实存在“jmxremote.password”文件。

    private Properties initialJMXServerProperties() throws RuntimeException 
    URL passwordURL = JMXConfig.class.getClassLoader().getResource(passwordFileName);
    URL accessURL   = JMXConfig.class.getClassLoader().getResource(accessFileName);

    String passFile     = Optional.ofNullable(passwordURL).map(URL::getPath).orElseThrow(() -> new RuntimeException("JMX password file not exist"));
    String accessFile   = Optional.ofNullable(accessURL).map(URL::getPath).orElseThrow(() -> new RuntimeException("JMX access file not exist"));

    Properties properties = new Properties();
    properties.setProperty(PASSWORD_FILE_PROP, passFile);
    properties.setProperty(ACCESS_FILE_PROP, accessFile);
    return properties;

【问题讨论】:

Can not read spring boot packaging jar file的可能重复 【参考方案1】:

您不能将 JAR 文件作为 URL 加载。您必须将其作为 InputStream 加载。

在你的情况下:

InputStream passwordInputStream = 
                 JMXConfig.class.getClassLoader().getResourceAsStream(passwordFileName);

在此处阅读更多信息: Reading a resource file from within jar

【讨论】:

【参考方案2】:

我也遇到过类似的问题。

class SomeClass
  @Autowired
  ResourceLoader resourceLoader;

  void someFunction()
    Resource resource=resourceLoader.getResource("classpath:preferences.json");
    Preferences defaultPreferences = objectMapper.readValue(resource.getInputStream(), Preferences.class);
 

在本例中,我已将 JSON 数据映射到 Preferences 类。在您的情况下,您可以使用

resource.getURL()

供进一步使用。这适用于开发环境和部署,这意味着它也可以在您在 tomcat 中构建和部署 JAR/WAR 或使用 java -jar 时使用。

【讨论】:

以上是关于[java]打包成jar之后找不到文件FileNotFoundException的主要内容,如果未能解决你的问题,请参考以下文章

java工程打包部署到linux下根据url找jar包里的文件找不到,请教。

maven 未将 resouces 下文件打包

Maven打包成Jar文件时依赖包的问题

java 代码里用了File类,打包后不能运行,报找不到文件的异常,该怎么解决?

java项目中jar包引用问题

jar打包完成后提示找不到主类,高手看一下哪一步有问题?