java - 使用类路径参数运行 jar

标签 java jar classpath


我可能错过了一些愚蠢的东西,但仍然如此。
我创建了一个具有以下内部结构的 jar 文件:

  • 文件夹1
  • 文件夹2
  • 元信息
  • 资源

其中folder1和folder2包含.class文件,而资源包含txt和png文件。
在我的代码中我有以下行

BufferedReader reader = new BufferedReader(new InputStreamReader(
                ClassLoader.getSystemResourceAsStream(txtFile)));

其中 txtFile 是一个包含位于资源文件夹内的文件名的字符串。 (直接在文件夹中)。
问题是当我尝试从命令行运行程序时。
这是我运行的命令。

java -cp externalJar.jar;myJar.jar;resources com.my.package.MyMainClass

程序运行并正常运行,我到达上面的代码行,其中出现空指针异常:

java.lang.NullPointerException
at java.io.Reader.<init>(Unknown Source)
at java.io.InputStreamReader.<init>(Unknown Source)
at com.my.package.MyMainClass.generateSomething(Unknown Source)
at com.my.package.MyMainClass.main

我猜这意味着我的类路径有问题 - 但我不知道是什么......

编辑
我正在使用 ant 编译我的程序并将其打包为可执行 jar。
这是我的 build.xml 的一部分:

<target name="jar" depends="compile">
    <jar destfile="${executable.jar}" basedir="${bin}">
        <zipfileset dir="${src}\resources" prefix="resources" />
        <manifest>
            <attribute name="Main-Class" value="MyMainClass" />
            <attribute name="Class-Path" value="externalJar.jar" />
        </manifest>
    </jar>
</target>

编辑 - 2
因为它应该是一个可执行 jar,所以 txtFile 变量的值被硬编码(除非作为参数给出)为资源目录中的文件名。所以最终,我想运行这个命令:
java -jar myJar.jar
不幸的是 - 这也会以相同的方式产生结果(同一行上的 NullPointerException )
编辑 - 3(发现不优雅的解决方案)
我发现,如果我将前缀 "resources/" 连接到类加载器读取的所有文件路径,那么它就可以正常工作 - 但我发现这并不优雅。有没有办法将资源文件夹添加到类路径中?

最佳答案

首先,如果您只打算访问与 MyMainclass 位于同一 jar 中的文件,则可以在其类加载器上调用 getResource()getResourceAsStream(),而不是 getSystemResource()/getSystemResourceAsStream()

public class MyMainClass {

    public static void main(String[] args) throws Exception {
        InputStream inputStream = MyMainClass.class.getResourceAsStream(args[0]);
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
    }
}

其次,您应该传递文件的路径,而不是传递类路径上的资源文件夹:

java -cp externalJar.jar;myJar.jar com.my.package.MyMainClass "/resources/myTextFileInUtf8.txt"

还请注意,在创建 InputStreamReader 时指定编码(几乎)总是一个好主意,否则您将依赖 JVM 默认编码。

关于java - 使用类路径参数运行 jar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24018149/

相关文章:

java - 打开 .jar 文件时为 "Could not find the Main class"

java - 使用 Bukkit/类路径

java - 设置 JAR 的类路径

java - 在 Ant 中运行 Junit 任务

java - 在终端中编译 java 应用程序

java - 显示树中每片叶子的完整路径

java - 我在哪里可以找到 android studio 中的数据库和表记录?

java - 为什么我的程序在循环中跳过提示?

java - Java 中的泛型——实现接口(interface)

java - 使用大量数据的 Swing 应用程序