java - 从命令行启动时,Java 中 File 对象的绝对路径不同

标签 java file ubuntu

我有一个包含以下代码的程序:

import java.io.File;
import javax.swing.JOptionPane;

public class Main {

    public static void main(String[] args) {
        File file = new File("config");
        JOptionPane.showMessageDialog(null, file.getAbsolutePath());
        System.out.println(file.getAbsolutePath());
    }
}

我将其导出为 Eclipse 中的 Runnable Jar。然后,我将文件复制到 Ubuntu 13.04 系统上的 /home/username/Desktop/cd 到该目录。当我运行命令 java -jar Main.jar 时,我得到以下输出:

/home/username/Desktop/config

现在我运行 chmod 使 Jar 可执行,然后双击 Jar。我从对话框中得到以下输出:

/home/username/config

为什么我得到不同的输出?将 Jar 移动到其他目录会产生类似的结果。谷歌搜索和搜索并没有阐明这个问题。

最佳答案

new File("config")相对于运行 JVM 的进程的工作目录。当您在 cd 之后从命令行运行时'ing 进入该目录,那就是工作目录。

从 Ubuntu GUI 中双击 jar 不会将工作目录设置为包含 jar 文件的同一目录,因此存在差异。

试试这个:

cd into /home/username从类似命令,然后输入 java -jar Desktop/Main.jar 。这将打印出与双击 jar 时相同的结果。

如果您想每次都获取相同的目录,请使用绝对目录名。在 Linux 上,可以通过以/开头的目录来实现这一点。例如new File("/home/username/config") 。如果您想动态查找用户主目录,请使用 System.getProperty("user.home") .

例如new File( System.getProperty("user.home") + "/config" );

关于java - 从命令行启动时,Java 中 File 对象的绝对路径不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15955718/

相关文章:

java - 文件观察器不适用于 android 10 及更高版本

c - 如何声明指向文件的动态指针数组

ios - 使用Objective-C签名文件(iOS/Mac)

java - Ghostscript 初始化失败,简单的 Ghost4J 示例代码

java - 加载异常: Root value already specified on custom control

java - 从基于 REST 的 Spring Controller 返回 "Resource"是否有意义?

java - 替换不在字符串中的单词

java - 如何在 HashMap 中添加、删除和保存值

python - 如果我想在 Ubuntu 上将 Python 2 与 Django 一起使用,如何安装 Python 3

bash - docker 无法指定容器连接