Я пишу некоторый плагин знатока генерала кода.
Мне нужен мой путь к классу проекта быть введенным в к моему сменному пути к классу выполнения.
Я нашел эту статью. Решение там работает, но довольно долго. Возможно, кто-то Вас знает из готового решения.
Нашел ответ !
Хорошо, Паскаль прав, вот он для основы !!
Итак, вот самый чистый способ (насколько я знаю) добавить путь к классам компиляции для выполнения вашего плагина.
Вот несколько примеров кода из моего плагина code-gen, который фактически генерирует некоторый шаблонный код на основе скомпилированного кода. Поэтому мне нужно было сначала скомпилировать код, затем проанализировать, сгенерировать какой-то код, а затем снова скомпилировать.
Используйте @configurator
в классе Mojo:
/ **
* @goal generate
* @phase process-classes
* @ configurator include-project-dependencies
* @requiresDependencyResolution compile + runtime
* /
открытый класс CodeGenMojo
расширяет AbstractMojo
{
public void execute ()
выбрасывает исключение MojoExecutionException
{
// выполняем работу ....
}
}
Обратите внимание на строку @configurator
в заголовке javadoc, она важна для контейнера IOC сплетения, а не просто еще одна строка комментария.
Реализация конфигуратора 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 ()]);
}
}
Вот часть сборки моего плагина, который вам нужно будет добавить.
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 плагина для тех, кому он нужен. Должен теперь скомпилироваться без проблем. (что-то не так с заголовком, игнорируйте его)