我可能错过了一些愚蠢的东西,但仍然如此。
我创建了一个具有以下内部结构的 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/