2012-05-22 2 views
4

Я пишу Maven плагин, который в основном должен сделать следующее:Как обрабатывать исходные файлы проекта в Maven плагин

  1. процесса всех классов проекта, построенного
  2. создать файл, описывающие части исходного кода
  3. добавить этот файл в банку построен (или как дополнение к MANIFEST или в качестве нового файла в каталоге META-INF)

Как я просто сделать мой первый шаги в создании плагинов maven здесь - мой (возможно, тупой) вопрос:

Как я могу получить доступ к исходному коду проекта из плагина, который выполняется при построении проекта (лучший способ: как пакеты на построенном пути что я могу легко обработать)?

Мой единственный подход до сих пор, чтобы получить источник проекта с чем-то вроде

// assuming the project exists (to exclude instance checks etc.) 
MavenProject project = (MavenProject) getPluginContext().get("project"); 
String projectSource = project.getSourceDirectory(); 

, а затем обрабатывать содержимое этого каталога с манипуляцией файла. Но мне кажется настолько уродливым, что я уверен, что существует лучшее решение (и я просто не смог найти его с помощью google, страниц maven и stackoverflow).

ответ

6

Вы знаете Mojo API, который содержит информацию о текущем проекте, например. Это может быть просто впрыскивается сплетение содержит автоматически, используя соответствующие маркеры, как следующее:

public class WhatEverMojo extends AbstractMojo { 

    /** 
    * The Maven project. 
    * 
    * @parameter expression="${project}" 
    * @required 
    * @readonly 
    */ 
    private MavenProject project; 
} 

Может быть я неправильно ваш вопрос, но я рекомендую прочитать Introduction to Plugin development.

Update: Это может помочь взглянуть на другие плагины, как apt-maven-plugin:

Вещь как следующее может помочь:

/** 
* The source directories containing the sources to be processed. 
* 
* @parameter expression="${project.compileSourceRoots}" 
* @required 
* @readonly 
*/ 
private List<String> compileSourceRoots; 

complete source code is available via SVN где вы глубоко заглянуть может ,

+1

Ваш ответ делает проверки типов/-casting ненужного (спасибо за это), но не решает мою проблемы: * Мне нужно проверить каждый класс проекта, если он содержит некоторые значения * Поэтому мне нужен доступ. эти классы в плагине (и я не могу найти это во введении/API). –

+0

Спасибо за обновление, я буду следовать вашему совету, чтобы изучить исходный код других плагинов, но apt-плагин действительно не помогает мне, поскольку он просто передает пути всех источников в apt ('com.sun.tools.apt. Main') и не обрабатывает их. Но я буду смотреть и сообщать о моих результатах здесь –

2

Синтаксис впрыснуть MavenProject Сейчас:

@Parameter(defaultValue = "${project}", required = true, readonly = true) 
MavenProject project; 

Вы должны добавить зависимость для maven-project к ПОМ вашего плагина:

<dependency> 
    <groupId>org.apache.maven</groupId> 
    <artifactId>maven-project</artifactId> 
    <version>2.0.6</version> 
</dependency> 

Затем для управления исходными файлами я не уверен, но кажется вероятным, что предпочтительным ответом является использование API файловой системы против MavenProject.getSourceDirectory(). Я не знаю, что вы ожидаете, что ядро ​​maven расскажет вам об этом источнике. Конечно, другие плагины - например, для компиляции java - могут иметь более сложные модели домена для определенных типов проектов.

1

Я использую статическое поле, потому что в одном запуске классы загружаются только один раз в загрузчик классов.

private static final Set<MavenProject> proceeded = new HashSet<MavenProject>(); 

@Override 
public void execute() throws MojoExecutionException { 
    MavenProject project = (MavenProject) getPluginContext().get("project"); 
    if (proceeded.contains(project)) { 
     getLog().info("Already done in this run."); 
     return; 
    } else { 
     proceeded.add(project); 
    } 
Смежные вопросы