Перебирать банки зависимостей проекта maven с помощью eclipse-resource-api (разработка плагинов)

#java #maven #eclipse-plugin #eclipse-rcp #m2eclipse

#java #maven #eclipse-плагин #eclipse-rcp #m2eclipse

Вопрос:

У меня есть проект maven. И я хочу перебрать его проекты зависимостей jar и прочитать в них некоторые файлы свойств. С помощью eclipse resource api я могу получить экземпляр IProject в workspace и получить доступ к его файлу classpath.

Путь к классу имеет следующую структуру.

     <classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
        <attributes>
            <attribute name="maven.pomderived" value="true"/>
            <attribute name="org.eclipse.jst.component.nondependency" value=""/>
        </attributes>
    </classpathentry>
  

Как я могу извлечь из этого фактические местоположения jar зависимостей?

вместо этого я ожидал чего-то подобного

 <classpath>
 <classpathentry kind="var" path="M2_REPO/apache-xerces/xercesImpl/2.9.1/xercesImpl-2.9.1.jar"/>
 <classpathentry kind="var" path="M2_REPO/apache-xerces/xml-apis/2.9.1/xml-apis-2.9.1.jar"/>
</classpath>
  

2. Или есть какой-нибудь лучший подход, чем этот, для программного чтения через банки зависимостей maven?

Ответ №1:

getResolvedClasspath Метод IJavaProject имеет дело с разрешением контейнеров:

 IProject project = ... get project

IJavaProject javaProject = JavaCore.create(project);

IClasspathEntry[] classPathEntries = javaProject.getResolvedClasspath(true);
  

JavaDoc говорит:

Это вспомогательный метод, возвращающий разрешенный путь к классу для проекта в виде списка простых (непеременных, неконтейнерных) записей пути к классу. Все записи переменной classpath и контейнера classpath в необработанном classpath проекта будут заменены простыми записями classpath, к которым они разрешаются.

Комментарии:

1. Кажется, так и нужно поступить. Попробую это. Спасибо.

2. Привет, можно ли получить доступ к файлам внутри записей пути к классам (банки зависимостей) как экземпляр iFile. ? Записи пути к классам на самом деле не находятся внутри рабочей области, не так ли. В моем случае мой заинтересованный находится внутри моего локального хранилища maven. Каков наилучший подход для доступа к этому файлу как iFile?

3. Или еще способ получить доступ к этой банке зависимостей как IProject?

4. Если их нет в рабочей области, вы не можете получить к ним доступ как к iFiles или IProject.

5. В таком случае, знаете ли вы, как мы могли бы получить доступ к файлам внутри записей пути к классам (jar-файлы)? Я пытался это сделать, но не сработало. for (IClasspathEntry classpathEntry: classPathEntries) { InputStream is = classpathEntry.getClass().getClassLoader().getResourceAsStream("META-INF/Packages.xml");}