Классы загрузки плагинов Maven - PullRequest
0 голосов
/ 17 октября 2011

У меня есть приложение с устаревшими действиями Struts, расширяющими org.apache.struts.StrutsActions. Я хотел бы быть уверен, что все мои классы, которые расширяют StrutsActions, имеют собственную аннотацию.

Чтобы обеспечить это, я написал небольшое правило Maven Inforcer для проверки моего требования. Однако я не знаю, как загрузить мои классы в моё додзё, чтобы проверить их.

На самом деле я сделал что-то необычное - инъекцию outputDirectory, и с помощью пользовательского загрузчика классов я рекурсивно загрузил все классы в папку сборки.

Спасибо

Ответы [ 2 ]

0 голосов
/ 28 декабря 2011

Я сделал это с помощью отражений

  <dependency>
     <groupId>org.reflections</groupId>
     <artifactId>reflections</artifactId>
     <version>0.9.5</version>
  </dependency>

моя реализация такова:

public void execute(EnforcerRuleHelper helper) throws EnforcerRuleException {

    URL url = getURL(helper.evaluate("${project.build.outputDirectory}"));

    Predicate<String> filter = new FilterBuilder().include(getTargetSuperTypeForSubtypes());
    Predicate<String> filter2 = new FilterBuilder().include(getMustHaveAnnotation());

    Reflections reflections = new Reflections(new ConfigurationBuilder()
     .setScanners(
        new TypeAnnotationsScanner().filterResultsBy(filter2),
        new SubTypesScanner().filterResultsBy(filter))
     .setUrls(url));

    validate(reflections);
}
0 голосов
/ 17 октября 2011

Все классы? Что ты имеешь в виду ? Может быть, вы имеете в виду target / classes / ** (который является местом вывода по умолчанию для классов) или, может быть, вы имеете в виду список нескольких расположений дерева каталогов?

Можете ли вы лучше объяснить, чем занимается ваш Mojo и с какой фазой и целями вы хотите связать его?

Я думаю, возможно, вы думаете о том, как неправильно применить цикл сборки Maven к вашему проекту. Не могли бы вы лучше объяснить, что делает ваш плагин, может быть, это работает "упаковка"?

Но если я вас правильно понимаю, вы хотите, чтобы при запуске плагина была добавлена ​​дополнительная запись classpath для target / classes / **? Таким образом, он может загружать код и ресурсы из самого проекта, чтобы изменить динамическое поведение внутри плагина maven?

Стандартный способ сделать это - <dependency>, но, конечно, для этого требуется фиксированная единица.

Другие плагины, которые допускают такое поведение (например, maven-antrun-plugin), предоставляют механизм для изменения пути к классам внутри Mojo и используют что-то из раздела <configuration> их pom.xml, чтобы сделать это. Не ясно, является ли используемый вами плагин Maven тем, который вы написали?

.

Проверка и упаковка, которая является допустимым вариантом использования. Но я спрашиваю, почему на «classpath»? Я предполагаю, что вы привязаны к фазе классов процессов.

т.е. classpath предназначен для предоставления кода / ресурсов среде выполнения для выполнения. Но в вашем случае у вас есть входной каталог, а не требование пути к классу.

В Mojo можно настроить сканер каталогов на входной каталог * / .class, а затем можно (используя некоторую библиотеку) открыть каждый файл и проверить аннотацию, не загружая ее.

Это также хороший вид разделения между ненадежными входными данными и последовательным поведением самого кода плагина. Что произойдет, если проект решит, что он хочет реализовать тот же пакет и / или класс, который используется в реализации самого плагина.

ОБНОВЛЕНИЕ: Если вы действительно загружаете классы, которые вы регистрируете, в JVM из вашего Mojo, то, по крайней мере, реализуйте свой собственный ClassLoader, чтобы сделать это. Это не обязательно простая проблема для решения. Вы заставляете этот ClassLoader находить вещи, указанные в конфигурации, во входном каталоге.

...