我正在编写一个Eclipse插件。我正在寻找获得所选java文件的正确方法,并找到相应的.class文件。
我现在这样做的方式适用于标准的Eclipse java项目,但似乎不太优雅:我调用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文件(编译错误,没有自动构建,等等)。我不关心那些;我只想知道是否有类文件,它的完整路径是什么?
答案 0 :(得分:3)
没有方法可以直接找到相应的类文件资源。获取相应输出文件夹的正确方法是:
IJavaElement
,最有可能是ICompilationUnit
(.java文件)IPackageFragmentRoot
(源文件夹)IClasspathEntry
IClasspathEntry.getOutputLocation()
或IJavaProject.getOutputLocation()
方法查找输出位置,具体取决于类路径条目是否具有单独的输出位置。ICompilationUnit
的包类文件可能存在也可能不存在,具体取决于项目是否已构建,是否存在构建路径错误等。因此,还有其他启发式方法,您需要使用它来确定上述算法的结果是否存在将是可用的。