Java获取main所在的Java文件的dir的路径

Java获取main所在的Java文件的dir的路径,java,linux-mint,Java,Linux Mint,我需要得到一个目录的路径。该目录包含找到main方法的java文件 所以我已经搜索了stackoverflow,但仍然没有找到答案 我已经使用了以下方法,但没有成功: File File=new文件(“name.java”); 字符串路径=file.getCanonicalPath(); System.out.println(路径) 输出为:/home/aaa/dev/robot/name.java String cwd=System.getProperty(“user.dir”); Syste

我需要得到一个目录的路径。该目录包含找到main方法的java文件

所以我已经搜索了stackoverflow,但仍然没有找到答案

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

  • File File=new文件(“name.java”);
    字符串路径=file.getCanonicalPath();
    System.out.println(路径)

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

  • String cwd=System.getProperty(“user.dir”);
    System.out.println(“当前工作目录:+cwd”)

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

  • fileresourcesdirectory=新文件(“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 mint。

    这将帮助您:

    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的调用

    因此,请致电您的终端以了解其功能:

    查找/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类的路径,它将变得更加困难


    如果你得到一行以上的内容,你可以考虑用它从代码中提取的任何信息来重排它。

    AAA是用户名。我知道我很有创造力你能解释一下为什么你需要主文件吗?因为听起来你好像认为你已经解决了问题的一部分,并希望得到帮助来解决其余的问题。我想不出任何需要主文件的场景。还有,我们说的是源文件还是编译的类文件?@Georgios你真的不应该这么做。重新考虑你的解决方案。@ Georgios,由于类路径在JVM中工作的方式,你想把编译的java文件(Fo.class)当作只读和非限制。这意味着您对源文件(编译和运行时)执行与生成类文件相同的操作。您应该仅对源中其他位置的这些文件使用文件夹。如果版本控制配置正确,它可以位于项目文件夹中。你可能想更详细地解释你想做什么以及为什么。你可以用一种相对简单的方法得到路径。这方面存在问题。在我看来,这不是正确的方法,它奏效了!我仍然觉得那样做很奇怪。我真的不明白为什么会这样。@Georgios你在做不寻常的事。您在java类旁边有一个资源,这不是一个好的实践。您应该将资源放在resources目录中,并像这样读取它们,这取决于JVM是否正确设置了当前工作目录。您不能总是这样认为。@Spara只有maven项目才引入了单独的资源和源文件夹的概念。@ThorbjørnRavnAndersen是的,您是对的,OP需要maven上的解决方案。我不太喜欢这个解决方案,因为我告诉OP这是一个非常糟糕的做法,我们应该避免它。这不是我想要的,因为我希望代码在不同的系统中运行,所以/home/aaa/dev/会有所不同。尽管如此,我还是尝试了获取以下代码:线程“main”java.io.FileNotFoundException中的异常:/tmp/pathtomainI刚刚更新了代码。您可以简单地拆分规范路径,以便在find命令中使用路径和名称的子字符串。当然,这只适用于Unix系统。@MelissaLoos您可能会觉得有趣。@MelissaLoos使用内置的跨平台功能是我对经验丰富的开发人员的期望。