【问题标题】:How to Create a File instance from the Jar/Classpath如何从 Jar/Classpath 创建文件实例
【发布时间】:2015-08-12 10:33:25
【问题描述】:

我有一个可执行的 JAR,其中有一个文件,我想从代码(不是 InputStream 或其他任何东西......只是文件)中将其作为 java.io.File 实例打开。

它是一个maven项目,文件位于“src/main/resources/file.xxx”的根目录下 该文件在打包后位于 jar 的根目录下(验证它在那里)。

我的第一次尝试:FileNotFoundException

java.io.File myFile = new java.io.File("file.xxx");
someMethodThatUsesTheFile(myFile); //I really need it to be a file!!!

其他尝试:FileNotFoundException

java.io.File myFile = new java.io.File("/file.xxx");
java.io.File myFile = new java.io.File("classpath:file.xxx");
java.io.File myFile = new java.io.File("classpath:/file.xxx");

我不确定到底发生了什么。 Web 应用程序可以轻松地从 webapp 根目录加载所有内容,我对为什么 JAR 应用程序的行为不同感到困惑。

附加信息:

  • 使用 Java8 作为运行时/构建
  • 运行 JAR 的命令:“java -jar myjar.jar”
  • 应用程序代码和文件都位于同一个 jar 中

【问题讨论】:

  • 您不能以File 实例的形式访问 inside jar 中的资源。如果您可以控制someMethodThatUsesTheFile 方法,则应将其更改为接受InputStream
  • JAR 中的资源不是文件,File 对象不能用 URL 参数构造。

标签: java file maven executable-jar


【解决方案1】:

简短回答:它不是“文件”,所以你不能这样做。

JAR 文件是一个文件,但不是它的内容。

替代方案是:

  • 尝试该方法的其他重载版本,InputStreams 是 通常是您的选项,您可以使用以下代码加载它:

    InputStream is = getClass().getResourceAsStream("file.xxx");

  • 将该文件移出 JAR 并移至 JAR 的同一目录中(考虑安全风险)

【讨论】:

    【解决方案2】:

    试试这个可能对你有帮助:

    URL url = this.getClass().getResource("src/main/resources/file.xxx");
    File file= new File(url.toURI());
    

    【讨论】:

    • src 目录在运行时不会存在,即使它存在,这也不是资源的正确路径。试试看。
    猜你喜欢
    • 2023-03-06
    • 2018-01-06
    • 2017-07-15
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多