Подтвердить что ты не робот

Есть ли 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 для фактического проекта, который у вас есть. Это было бы здорово, если бы я мог переопределить входные данные или что-то еще.

Спасибо всем!

4b9b3361

Ответ 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 файле дает некоторые подсказки относительно правильного зависимого артефакта.