Java 获取main所在的java个文件的目录路径

Java get path of dir of java file where main is located

我需要获取目录的路径。该目录包含找到主要方法的 java 文件。

所以我已经在Whosebug上搜索过了,还是没有找到答案。

我已经使用了以下但没有成功:

  1. File file = new File("name.java"); String path = file.getCanonicalPath(); System.out.println(path);

    输出为:/home/aaa/dev/robot/name.java

  2. String cwd = System.getProperty("user.dir"); System.out.println("Current working directory : " + cwd);

    当前工作目录:/home/aaa/dev/robot

  3. File resourcesDirectory = new File("src/test/resources"); System.out.println(resourcesDirectory.getAbsolutePath());

    /home/aaa/dev/robot/src/test/resources

我真正需要的是:

/home/aaa/dev/robot/src/main/java/com/aaa/robot

其中 name.java 被发现。

我在 linux 铸币厂。

这将帮助您:

import java.io.File;

public class Test {

    public static void main(String[] args) {
        String name = Test.class.getName().replace(".", File.separator);
        String path = System.getProperty("user.dir") + File.separator + "src" + File.separator + "main" + File.separator + "java" + File.separator + name.substring(0, name.lastIndexOf(File.separator));
        System.out.println(path);
    }

}

由于后面的代码没有按预期工作,我更新了它。

String canSubString = canonicalPath.substring(0,canonicalPath.lastIndexOf("/")); //+/- 1 character, just check the output.
String classname = canonicalPath.substring( canonicalPath.lastIndexOf("/") + 1);
String command = "find " + canSubString + " -name " + classname;
Process p = Runtime.getRuntime().exec(command);
BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));  
System.out.println(in.readLine());

从这里开始就不要继续阅读了。

您可以在您的代码中调用命令行工具 find,让它只在那里查找,因为我们假设您确实知道 Main 的名称。

所以调用您的终端以了解它的作用:

find /home/aaa/dev/ -name "name.java"

现在,我们需要将它与Java结合起来。

Process p = Runtime.getRuntime().exec("find /home/aaa/dev/ -name 'name.java'");

不过您仍然需要获取输出。由于不习惯从 Java 调用命令行工具,我只是将输出写入文件

Process p = Runtime.getRuntime().exec("find /home/aaa/dev/ -name 'name.java' > /tmp/pathtomain" );

此时您将在 /tmp/pathtomain 中找到您要查找的路径。 /tmp文件夹默认在系统关机时清空,所以如果不是敏感信息不需要删除该文件。

最后您需要从该文件中读出。

Scanner scanner = new Scanner(new FileInputStream(new File("/tmp/pathtomain")));
String path = "";
while(scanner.hasNext()) {
     path += scanner.nextLine() + "\n";
}

如果文件名只存在一次,那么这将导致只有一行的字符串。这将变得更加困难,如果你想找到一些通向具有通用名称(如 Main)的 Mainclass 的路径。

如果你得到不止一行,你可以考虑使用你可以从代码中提取的任何信息对其进行正则表达式处理。