【问题标题】:Java - Classpath issueJava - 类路径问题
【发布时间】:2023-03-11 11:19:03
【问题描述】:

我有一个 products.jar 文件。里面有一个类com.ClassA。项目的结构是这样的

products
    |--test
        |--com
            |--ClassA.java
        |--dependencies
            |---inputs.txt

在 Eclipse 中,ClassA.java 正在通过以下路径访问inputs.txt 文件,并且工作正常

private static final String PROPERTIES_FILE_PATH = "test/dependencies/inputs.txt";

test 包位于 java 构建路径 -> 源代码

但是当我将这个项目导出为products.jar 时,我发现jar 文件中没有test 目录。 jar 文件的根目录有两个目录comdependencies。因此,当我尝试通过命令行执行ClassA(位于 jar 文件中)时,出现以下异常:

JUnit version 4.8.2
java.io.FileNotFoundException: test/dependencies/inputs.txt (No such file or directory)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:137)
at java.io.FileInputStream.<init>(FileInputStream.java:96)

所以在发现test 目录没有被导出到jar 文件中后,我将ClassA.java 中的文件路径更改为dependencies/inputs.txt。它在 Eclipse 中不起作用,但我认为它会在 jar 中起作用,因为 jar 文件位于类路径中,而 dependencies 文件夹位于 jar 文件的根目录中,因此 java 启动器将能够找到 dependencies 文件夹和然后inputs.txt 文件。

但不幸的是它也不起作用。

【问题讨论】:

    标签: java resources classpath


    【解决方案1】:

    您不能使用FileInputStream 来读取打包在 JAR 中的文件 - 它不再是文件。 FileInputStream 仅适用于实际磁盘文件。

    您需要使用Class.getResourceAsStream (javadoc) 读取资源,例如

    InputStream stream = getClass().getResourceAsStream("/dependencies/inputs.txt");
    

    您省略了 test 前缀,因为它不在 JAR 文件结构中。

    【讨论】:

      【解决方案2】:

      FileInputStream() 不会读取 jar 中的内容,只会读取文件系统上的文件。使用 .getClass().getResourceAsStream(resourcename).getClass().getClassLoader().getResourceAsStream(resourcename)

      有关class getResourceAsStreamclassloader getResourceAsStream() 的javadocs 的更多信息

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-24
        • 1970-01-01
        • 1970-01-01
        • 2017-09-19
        • 1970-01-01
        • 1970-01-01
        • 2011-02-20
        • 2011-02-01
        相关资源
        最近更新 更多