В плагине Eclipse, как правильно получить файл .class, который соответствует выбранному файлу Java? - PullRequest
2 голосов
/ 25 сентября 2011

Я пишу плагин Eclipse. Я ищу правильный способ получить выбранный файл Java и найти соответствующий ему файл .class.

То, как я это делаю, теперь работает для стандартного Java-проекта Eclipse, но выглядит менее элегантно: я вызываю IJavaProject # getOutputLocation и объединяю это с путем к выбранному файлу. Тогда я просто изменяю .java на .class.

Вот код для метода, который переводит из входящего выбора в путь:

def selection_to_path selection
    path = selection.get_paths.first

    output_location = path.get_first_segment.get_output_location
    root = org.eclipse.core.resources::ResourcesPlugin.getWorkspace().get_root
    folder = root.get_folder output_location
    folder.get_location.to_s

    path_to_file_as_string = path.get_last_segment.get_path.to_s
    path_to_file_as_string[/\.java$/] = ".class"
    path_elements_of_java_file = path_to_file_as_string.split("/")[3..-1]

    all_elements = folder.get_location.to_s.split("/") + path_elements_of_java_file

    File.join(all_elements)
  end

Это работает, но я подозреваю, что оно часто терпит неудачу, и это неправильно. В частности, в документации по getOutputLocation говорится, что мои предположения о расположении файлов классов слишком упрощены.

Так, как правильно это сделать?

Мне не нужно, чтобы это работало все время. Конечно, будет много случаев, когда .java-файл не имеет соответствующего .class-файла (ошибки компиляции, автоматическая сборка и т. Д.). Меня это не волнует; Я просто хочу знать, существует ли файл класса, каков его полный путь?

1 Ответ

3 голосов
/ 25 сентября 2011

Нет метода, который напрямую находит ресурс файла соответствующего класса. Правильный способ получить соответствующую выходную папку:

  • Преобразование выделения в IJavaElement, наиболее вероятно ICompilationUnit (файлы .java)
  • Найдите соответствующий IPackageFragmentRoot (исходная папка)
  • Найти решение IClasspathEntry
  • Найдите выходное местоположение, используя IClasspathEntry.getOutputLocation() или метод IJavaProject.getOutputLocation(), в зависимости от того, имеет ли запись classpath отдельное выходное местоположение.
  • Построить путь к пути к классам на основе пакета ICompilationUnit

Файл класса может существовать или не существовать в зависимости от того, был ли проект собран, есть ли ошибки пути сборки и т. Д. Итак, существуют дополнительные эвристики, которые необходимо использовать, чтобы определить, является ли результат вышеприведенного алгоритма будет использоваться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...