Eclipse PDE: учитывая относительный путь, такой как /ProjectName/lib/something.jar, как получить полный путь к файловой системе? - PullRequest
5 голосов
/ 04 февраля 2012

Я пытаюсь найти путь к файлу jar, который находится в необработанном пути к классам. getRawClasspath возвращает коллекцию объектов IClasspathEntry. Я могу вызвать getPath на тех.

Но getPath возвращает что-то странное: IPath, который начинается с имени проекта, например:

/ ProjectName / Библиотека / something.jar

Как правильно превратить этот относительный путь в полный путь ОС? Сначала я подумал, что могу просто добавить путь к корню рабочей области, но это не работает, поскольку между рабочей областью и проектом часто существуют промежуточные каталоги.

И вообще, как мне узнать, что делать с IPath, возвращаемым методом? Кажется, я никогда не знаю, что это за IPath; относительно проекта, относительно рабочей области, относительно проекта, но с именем проекта в качестве первого элемента, относительно фазы луны ... Это все сбивает с толку, и документация никогда не помогает - или, по крайней мере, я не понимаю не знаю, где искать.

UPDATE

Теперь я еще больше сбит с толку. Проблема по-прежнему заключается в том, что когда у вас есть IClasspathEntry, мне все еще неясно, как разрешить его в пути к файловой системе.

Ответ, который говорит: «если путь начинается с / это абсолютный путь (относительно рабочего пространства), неверен. Проблема в том, что метод getPath в IClasspath возвращает одну из двух вещей: путь, начинающийся с косая черта, относящаяся к рабочей области, или IPath, начинающийся с /, который является фактическим путем к файловой системе. Да, две совершенно разные вещи объединены в один тип. Вы получаете вариант файловой системы, когда jar находится за пределами рабочей области, и вы получаете «абсолютный» вариант, когда он находится в рабочей области.

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

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

Ответы [ 4 ]

5 голосов
/ 04 февраля 2012

попробуйте это:

    IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
    IResource res = root.findMember("/ProjectName/lib/something.jar");
    System.out.println(res.getLocation().toString());
1 голос
/ 14 июля 2012

Пути в Eclipse являются сложными, и есть несколько других ситуаций, о которых вы не упомянули, таких как контейнеры classpath (пример JRE), связанные ресурсы вне рабочей области и переменные classpath.

Toупрощенно, я предлагаю вам использовать getResolvedClasspath вместо этого, который возвращает только «простые» записи classpath (без переменных, без контейнеров).Согласно Javadoc, он возвращает абсолютные пути, и их интерпретация зависит от типа записи:

  • CPE_LIBRARY - если это внешняя библиотека, это путь к файловой системе (и с ней не связаноресурс, то есть вы не можете найти его с помощью findMember).В противном случае это путь, основанный на корне рабочей области
  • CPE_PROJECT - абсолютный путь к проекту
  • CPE_SOURCE - абсолютный путь к исходной папке

Все абсолютные пути интерпретируются в рабочей области.Если вам нужен путь к файловой системе, вам нужно пройти getLocation.

В качестве дополнительного примечания не существует сопоставления 1: 1 между объектами файловой системы и ресурсами рабочей области.Из-за ссылок рабочего пространства у вас может быть несколько путей рабочего пространства, указывающих на одно и то же (файловая система) местоположение.

0 голосов
/ 09 сентября 2015

Это лучшее, что я мог придумать, и это совершенно отвратительный взлом, да:

private IPath getCorrectAbsolutePath(IJavaProject project, IPath path) throws IllegalArgumentException {
    final String projectName = project.getProject().getName();
    if (path.segmentCount() > 1 && path.segment(0).equals(projectName)) {
        IPath projectAbsolutePath = project.getProject().getLocation();
        IPath relativePath = path.removeFirstSegments(1);
        return projectAbsolutePath.append(relativePath);
    } else {
        if (!path.isAbsolute())
            path = path.makeAbsolute();
        if (!path.isAbsolute())
            throw new IllegalArgument("Cannot make IPath absolute: " + path.toString()); 
        return path;
    }
}
0 голосов
/ 04 февраля 2012

У меня есть предложение, посмотрите прикрепленное изображение, найдите свойство "location" в свойствах любого плагина eclipse, возможно, сможете найти его откуда.но извините, у меня нет 10 репутации, вы можете видеть картинку из URL ссылки

...