Есть ли Java-класс, который создает файл POM.xml?
В моем проекте работы меня недавно попросили создать POM файлы через класс java. Проблема в том, что я очень, очень новичок в Maven (например, с декабря прошлого года).
Мне нужен код, который генерирует xml файл (файл pom, но если я могу настроить любой код создания xml, который будет в порядке), учитывая все необходимые данные, поэтому им не нужно писать его рука. Я не знаю, объясняю ли я себя, но вопрос в том, есть ли библиотека или класс, который генерирует или создает файл POM с данными?
Если это не так, я просто не хочу потерять больше времени для поиска чего-то, чего я не знаю, даже если он существует, или если это так же просто, как объявление объекта POM, а затем выполнение тривиального документа d = generatePom (POM п). Поскольку никто не жалуется на то, как трудно писать файлы POM, я полагаю, что должен быть простой способ сделать это, но я думаю, что потерял себя во многих API javadoc, и я не могу найти свой путь назад.
Моя идея, если нет кода для этого, заключается в поиске словаря POM (для охвата всех элементов) и создания xml файла с данным объектом POM (который я ранее заполнял данными, которые я предоставил), используя генератор XML, такой как JDOM, XOM или XStream. Любые мысли об этом будут оценены, если нет класса, который уже делает это (например, "эй, вы делаете это НЕПРАВИЛЬНО" ).
PS: Я прочитал, что проект Eclipse выполняет некоторые вещи Maven и имеет API, который генерирует файл pom.xml для фактического проекта, который у вас есть. Это было бы здорово, если бы я мог переопределить входные данные или что-то еще.
Спасибо всем!
Ответы
Ответ 1
Это зависит от того, что вы пытаетесь сделать. Если вы просто хотите создавать POM для новых проектов определенного типа, лучший способ - использовать архетипы Maven (вы можете создавать свои собственные архетипы с нужными шаблонами).
Если вам действительно нужна программная запись POM, вы можете использовать следующее:
import org.apache.maven.model.*;
import org.apache.maven.model.io.xpp3.MavenXpp3Writer;
...
Model model = new Model();
model.setGroupId( "some.group.id" );
...
new MavenXpp3Writer().write( w, model );
... где w является java.io.Writer, и вы добавляете всю необходимую обработку исключений.
Javadoc здесь: http://maven.apache.org/ref/2.2.1/maven-model/apidocs/index.html
Чтобы получить доступ к этому API, вы должны добавить эту зависимость:
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-model</artifactId>
<version>2.2.1</version>
</dependency>
Существует также соответствующий API-интерфейс чтения, но имейте в виду, что он не будет выполнять все операции Maven, такие как наследование и интерполяция (для этого требуется более расширенное использование API).
Ответ 2
MavenXpp3Reader reader = new MavenXpp3Reader();
Model pomModel = reader.read(new FileReader(pomLibFile));
final List<Dependency> dependencies= pomModel.getDependencies();
final List<String> modules= pomModel.getModules();
final List<Profile> profiles = pomModel.getProfiles();
InputStream inputStream = new FileInputStream(new File(pomLibFile));
StringWriter writer = new StringWriter();
IOUtils.copy(inputStream, writer, "utf-8");
pomModel.getDependencyManagement();
final Properties properties = new Properties();
properties.load(new FileInputStream(pomProperties));
RegexBasedInterpolator interpolator = new RegexBasedInterpolator();
interpolator.addValueSource( new EnvarBasedValueSource() );
interpolator.addValueSource( new PropertiesBasedValueSource( properties ) );
List<String> synonymPrefixes = new ArrayList<String>();
synonymPrefixes.add( "project." );
synonymPrefixes.add( "pom." );
PrefixedValueSourceWrapper modelWrapper = new PrefixedValueSourceWrapper( new ObjectBasedValueSource( pomModel ),synonymPrefixes, true );
interpolator.addValueSource( modelWrapper );
PrefixedValueSourceWrapper pomPropertyWrapper =
new PrefixedValueSourceWrapper( new PropertiesBasedValueSource( pomModel.getProperties() ), synonymPrefixes, true );
interpolator.addValueSource( pomPropertyWrapper );
interpolator.addValueSource( new PropertiesBasedValueSource( properties ) );
RecursionInterceptor recursionInterceptor = new PrefixAwareRecursionInterceptor( synonymPrefixes, true );
String serializedPOM = interpolator.interpolate( writer.toString(), recursionInterceptor );
System.out.println("-------- "+serializedPOM);;
Ссылка: http://plexus.codehaus.org/plexus-components/plexus-interpolation/index.html
хотя я все еще застрял, если мне нужно добавить несколько (неизвестное количество) зависимостей.
Ответ 3
Почему вы должны делать это в java, а не с помощью существующего инструмента, такого как m2eclipse.
См. руководство для создания POM для существующего проекта с использованием m2eclipse.
Вы также можете увидеть руководство разработчика m2eclipse, которое позволит вам увидеть исходный код для их реализации.
Ответить ----
Это обычная проблема, возникающая при попытке обуздать проект.
Самое большое препятствие пытается определить правильные координаты maven.
Часто проекты относятся к переименованным файлам jar, где идентификаторы группы и номера версий были удалены.
Иногда проверка манифеста в jar файле дает некоторые подсказки относительно правильного зависимого артефакта.