Добавьте путь к классу сборки знатока к сменному пути к классу выполнения

Я пишу некоторый плагин знатока генерала кода.

Мне нужен мой путь к классу проекта быть введенным в к моему сменному пути к классу выполнения.

Я нашел эту статью. Решение там работает, но довольно долго. Возможно, кто-то Вас знает из готового решения.

33
задан Jasper de Vries 1 April 2018 в 09:08
поделиться

1 ответ

Нашел ответ !

Хорошо, Паскаль прав, вот он для основы !!

Итак, вот самый чистый способ (насколько я знаю) добавить путь к классам компиляции для выполнения вашего плагина.

Вот несколько примеров кода из моего плагина code-gen, который фактически генерирует некоторый шаблонный код на основе скомпилированного кода. Поэтому мне нужно было сначала скомпилировать код, затем проанализировать, сгенерировать какой-то код, а затем снова скомпилировать.

  1. Используйте @configurator в классе Mojo:

     / ** 
     * @goal generate 
     * @phase process-classes 
     * @ configurator include-project-dependencies 
     * @requiresDependencyResolution compile + runtime 
     * / 
    открытый класс CodeGenMojo 
    расширяет AbstractMojo 
     {
    public void execute () 
    выбрасывает исключение MojoExecutionException 
     {
     // выполняем работу .... 
    } 
    } 
     

    Обратите внимание на строку @configurator в заголовке javadoc, она важна для контейнера IOC сплетения, а не просто еще одна строка комментария.

  2. Реализация конфигуратора include-project-dependencies . Есть очень хороший класс, который я взял у какого-то Брайана Джексона, добавьте его в исходный код вашего плагина.

     / ** 
     * Пользовательский ComponentConfigurator, который добавляет элементы пути к классам среды выполнения проекта 
     * к 
     * 
     * @author Brian Jackson {{1} } * @ с 1 августа 2008 г., 15:04:17 
     * 
     * @ plexus.component role = "org.codehaus.plexus.component.configurator.ComponentConfigurator" 
     * role-hint = "include-project-dependencies" 
     * @ plexus.requirement role = "org.codehaus.plexus.component.configurator.converters.lookup.ConverterLookup "
     * role-hint =" default "
     * / 
    открытый класс IncludeProjectDependenciesComponentConfigurator расширяет AbstractComponentConfigurator {
     
    частный статический конечный регистратор LOGGER = Logger .getLogger (IncludeProjectDependenciesComponentConfigurator.class); 
     
    public void configureComponent (компонент объекта, конфигурация PlexusConfiguration, 
    ExpressionEvaluator expressionEvaluator, ClassRealm containerRealm, 
    слушатель ConfigurationListener) { }} выбрасывает ComponentConfigurationException {
     
    addProjectDependenciesToClassRealm (expressionEvaluator, containerRealm); 
     
    converterLookup.registerConverter (новый ClassRealmConverter (containerRealm)); 
     {{ 1}} ObjectWithFieldsConverter converter = new ObjectWithFieldsConverter (); 
     
    converter.processConfiguration (converterLookup, компонент, containerRealm.getClassLoader (), конфигурация, 
    expressionEvaluator, listener); {{1 }}} 
     
    private void addProjectDependenciesToClassR ealm (ExpressionEvaluator expressionEvaluator, ClassRealm containerRealm) выбрасывает ComponentConfigurationException 
    List  runtimeClasspathElements; 
    try {
     // noinspection unchecked 
    runtimeClasspathElements = (List  ) expressionEvaluator.evaluate ("$ {project.runtimeClasspathElements}"); 
    } catch (ExpressionEvaluationException e) {
    throw new ComponentConfigurationException ("Возникла проблема при оценке: $ {project.runtimeClasspathElements}" , e); 
    } 
     
     // Добавьте зависимости проекта в конечный URL ClassRealm 
     [] urls = buildURLs (runtimeClasspathElements); 
    для (URL-адрес: URL-адреса) {
    containerRealm.addConstituent (url); 
    } 
    } 
     
    частный URL [] buildURLs (List  runtimeClasspathElements) выбрасывает ComponentConfigurationException {
     // Добавить классы и зависимости проектов 
    List  urls = new ArrayList  (runtimeClasspathElements.size ()); 
    for (String element: runtimeClasspathElements) {
    попробуйте {{ {1}} url конечного URL = новый файл (элемент) .toURI (). ToURL (); 
    urls.add (url); 
    if (LOGGER.isDebugEnabled ()) {{{ 1}} LOGGER.debug ("Добавлено в загрузчик классов проекта:" + url); 
    } 
    } catch (MalformedURLException e) {
    throw new ComponentConfigurationException ("Невозможно получить доступ project dependency: "+ element, e); 
    } 
    } 
     
     // Добавляем зависимости плагина (чтобы материалы Trove работали, если Trove не установлен { {1}} return urls.toArray (новый URL [urls.size ()]); 
    } 
     
    } 
     
  3. Вот часть сборки моего плагина, который вам нужно будет добавить.

      4.0.0  
      com.delver  
      reference-gen -plugin  
      Плагин Maven для создания эталонного кода  
     
      maven-plugin  
      1.2  
     
      http://maven.apache.org  
     
      
      2.2.1  
      
     
      
      
     < плагин> 
      org.codehaus.plexus  
      plexus-maven-plugin  
      
     < выполнение> 
      
      дескриптор  
      
      
      
      
      
      
      
     
      {{ 1}}  org.apache.maven  
      maven-artifact  
      $ {maven.version}  {{ 1}}  
      
      org.apache.maven  
      maven-plugin-api  
      $ {maven.version}  
      { {1}}  
      org.apache.maven  
      maven-project  
      $ {maven .version}  
      
      
      org.apache.maven  
      maven -модель  
      $ {maven.version}  
      
      
      org. apache.maven  
      maven-core  
      2.0.9  
      {{1} } 
      
     

    Вот pom.xml плагина для тех, кому он нужен. Должен теперь скомпилироваться без проблем. (что-то не так с заголовком, игнорируйте его)

19
ответ дан 27 November 2019 в 18:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: