Java从jar

时间:2017-12-22 08:40:24

标签: java maven jar

public class Main {
  public static void main(String[] args) throws IOException {
    System.out.println("----------Start------------------");
    URL resource = Main.class.getClassLoader().getResource("test.txt");
    System.out.println("resource: "+ resource.getPath());

    File file = new File(resource.getPath());
    BufferedReader reader = new BufferedReader(new FileReader(file));
    String line;
    while ((line = reader.readLine()) != null) {
      System.out.println(line);
    }
    reader.close();
    System.out.println("----------End------------------");
  }
}

如果我从IDEA运行此代码 - 所有工作

----------Start------------------
resource: /D:/javaHz/target/classes/test.txt
1
2
3
4
5
----------End------------------

处理完成,退出代码为0

如果我从java -jar重新开始 - 我收到错误

D:\hz>java -jar hzTest-jar-with-dependencies.jar
----------Start------------------
resource: file:/D:/hz/hzTest-jar-with-dependencies.jar!/test.txt
Exception in thread "main" java.io.FileNotFoundException: D:\hz\file:\D:\hz\hzTe st-jar-with-dependencies.jar!\test.txt (Syntax error in file name, folder name, or volume label)
        at java.io.FileInputStream.open0(Native Method)
        at java.io.FileInputStream.open(FileInputStream.java:195)
        at java.io.FileInputStream.<init>(FileInputStream.java:138)
        at java.io.FileInputStream.<init>(FileInputStream.java:93)
        at java.io.FileReader.<init>(FileReader.java:58)
        at test.Main.main(Main.java:15)

我不想使用getResourceAsStream

3 个答案:

答案 0 :(得分:2)

new File(resource.getPath())无法正常工作,因为file:/D:/hz/hzTest-jar-with-dependencies.jar!/test.txt并非真正的文件系统路径。

由于该文件是 jar 文件(实际上是 zip 存档)的一部分,因此没有指向它的有效文件系统路径。

标准方法是使用getClassLoader().getResourceAsStream("test.txt");。您必须修改应用程序以便它可以从类路径资源或URL读取,或使用getResourceAsStream()将资源复制到文件系统上的临时文件,然后指向它。

答案 1 :(得分:-1)

File file = new File(resource.getPath());

Bzzt。资源不是文件。你有一个URL。直接使用其输入流。

答案 2 :(得分:-1)

将URL转换为可在Java外部使用的绝对路径的正确方法是:

import java.net.URL;
import java.nio.file.Paths;

URL resource = Main.class.getClassLoader().getResource("test.txt");
String absolutePath = Paths.get(resource.toURI()).toAbsolutePath());

这仅适用于资源来自file://网址的情况 - 如果您的应用程序是作为jar文件构建的,那么它将无法正常工作,因为其他应用程序无法直接查看jar文件。< / p>

看起来有点令人费解,而且确实如此。为了打破这一点:

URL resource = ...;
URI uri = resource.toURI();
Path path = Paths.get(uri);
String absolutePath = path.toAbsolutePath();