正在打开位于Java jar目录中的文件,而不是当前工作目录中的文件

正在打开位于Java jar目录中的文件,而不是当前工作目录中的文件,java,relative-path,Java,Relative Path,我有一个Java桌面应用程序,是我在NetBeans中开发的,我将其压缩分发给学生。在这个zip文件中,我有.jar,一个包含swing布局jar的“lib”目录,以及一个名为“sourcefiles”的目录,其中包含程序所需的所有文本文件 如果双击jar文件,一切都可以正常工作,但是当从命令行运行时(java-jar MyApp.jar),只有在运行命令之前先将cd刻录到文件所在的目录,它才能找到“sourcefiles”目录,这是一些学生忘记做的事情。显然,无法从代码中更改当前工作目录。“s

我有一个Java桌面应用程序,是我在NetBeans中开发的,我将其压缩分发给学生。在这个zip文件中,我有.jar,一个包含swing布局jar的“lib”目录,以及一个名为“sourcefiles”的目录,其中包含程序所需的所有文本文件

如果双击jar文件,一切都可以正常工作,但是当从命令行运行时(
java-jar MyApp.jar
),只有在运行命令之前先将cd刻录到文件所在的目录,它才能找到“sourcefiles”目录,这是一些学生忘记做的事情。显然,无法从代码中更改当前工作目录。“sourcefiles”的路径在我的代码中作为相对路径给出,假设我在MyApp文件夹中。那么,我该怎么做才能从命令行运行程序,而不必cd到包含的目录?是否要将此添加到清单文件中


这个问题主要是使用Linux的学生面临的,但在Mac上也是如此。我假设它在Windows上是相同的,但我想没有一个Windows学生从命令行运行它。

您不能更改默认目录,但您可以获取类运行的Jar目录,并在代码中使用它作为基本路径

String jarLocation = ThisClass.class.getProtectionDomain()
                         .getCodeSource().getLocation().getPath();

从中可以得到jar所在的目录。您很可能希望将其包装为学生可以调用的方法。

如何访问代码中的资源?BufferedReader f=new BufferedReader(new InputStreamReader(new FileInputStream(filename),“UTF-8”);其中filename是相对路径:sourcefiles/xxxxx。运行程序的jar文件、java库和sourcefiles文件夹都在一个文件夹中,然后我将其压缩发送给学生。我不想让源文件包含在jar中,因为它们是程序可以修改的资源。这条路径似乎适用于除命令行之外的所有内容。(这些是人文学科的学生,有些人比其他人更精通技术。)我使用了zikaDirectory=jarFile.getParentFile().getName();然后如果(!zikaDirectory.equals(currentWorkingDirName))来找出是否发生了这种情况,但我对你文章的最后一行感到困惑,这是关于学生使用该程序可以调用的方法。@Numa我建议你给学生一些代码,隐藏一些更难的代码。