【问题标题】:How to read .sql files internally in Java jar?如何在 Java jar 内部读取 .sql 文件?
【发布时间】:2015-04-08 20:42:53
【问题描述】:

我目前在 SQL 中有一个架构文件文件夹,在执行应用程序时会执行这些文件。这是我用来读取和执行这些文件的:

private static String getSchemaFromFile(String filename) throws IOException {
    StringBuilder stringBuilder = new StringBuilder();
    BufferedReader bufferedReader = new BufferedReader(new FileReader("src/schema/" + filename + ".sql"));
    String queryString;

    .....
}

我认为问题与架构文件夹的路径有关。我尝试查看 getResourceAsStream 但似乎无法正常工作。

当我从 Eclipse 运行时它工作正常,但是当我将它编译成 JAR 时它说找不到文件。如何确保路径正确?

【问题讨论】:

  • 架构文件是否位于 jar 文件内?如果是这样,那么您的代码只是在寻找文件夹(该文件夹不存在,因为它在 jar 文件中)。您需要在运行时解析您的 jar 文件并以这种方式获取文件。
  • getResourceAsStream 是您在这里需要的。你试了怎么失败了?
  • @honerlawd 我该怎么做。我得到cannot resolve constructor FileReader

标签: java jar bufferedreader filereader


【解决方案1】:

类似的东西。顺便说一句,除非您正在运行 jar,否则这可能会失败(在 eclipse 中执行它可能不起作用)。

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("src/schema/" + filename + ".sql")));

【讨论】:

    【解决方案2】:

    从 eclipse 中它可以工作,因为 eclipse 启用 java 代码从 src/schema/ 目录搜索。但是当您使用 jar 时,它需要一个绝对路径。

    我建议将您放置.sql 文件的绝对路径存储在属性文件中,以便您可以随时更改。假设您从属性文件中获得了位置absolutePath。然后你可以这样做 -

    BufferedReader bufferedReader = new BufferedReader(new FileReader(absolutePath + filename + ".sql"));
    

    【讨论】:

      【解决方案3】:

      如果架构在 jar 文件中,则 src/schema 可能无效,更有可能在 schema/ 中。首先,您需要确认这一点。 jar 文件实际上是一个 zip 文件,因此您可以使用 winzip 之类的实用程序将其解压缩以检查内容。

      一旦确认架构文件的位置,就无法使用 FileReader 访问它们,因为它们不在文件系统中,而是在您的 jar 中。要从 jar 文件中访问文件,getResourceAsStream 是正确的方法。可能是您上次尝试时定义了错误的文件夹。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-04
        • 1970-01-01
        • 1970-01-01
        • 2012-11-11
        • 2013-01-17
        • 2010-09-29
        相关资源
        最近更新 更多