Поскольку последний код не работал должным образом, я обновил его.
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());
С этого момента просто не читайте дальше.
Вы можете вызвать командную строкуинструмент найти в своем коде и разрешить его только там, так как мы предполагаем, что вы на самом деле знаете, как называется 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";
}
Если имя файла существует только один раз, то это приведет к наличию строки в одну строку.Это станет более трудным, если вы захотите найти какой-нибудь путь к Mainclass с таким общим именем, как Main.
Если вы получите более одной строки, вы можете рассмотреть возможность регулярного выражения над ней с любой информацией, которую вы можете извлечь из кода.