Есть ли класс Java, который генерирует файл POM.xml? - PullRequest
18 голосов
/ 25 января 2010

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

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

Ответы [ 4 ]

40 голосов
/ 25 января 2010

Это зависит от того, что вы пытаетесь сделать. Если вы просто хотите создать 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).

3 голосов
/ 07 августа 2014
        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

хотя я все еще застрял, если мне нужно добавить несколько (неизвестное количество) зависимостей.

2 голосов
/ 12 мая 2018

Чтобы сгенерировать pom с несколькими зависимостями, вы можете использовать следующий пример кода:

Model model = new Model();  
Writer writer = new FileWriter("C:/GRADLE_WORKSPACE/test.pom");  
List<Dependency> dependencyList = new ArrayList<Dependency>();  

model.setGroupId( "TestGroupArtifactID" );    
model.setArtifactId("TestGroupArtifactName");    
model.setVersion("1.0.0");    

Dependency dep = new Dependency();    
dep.setGroupId("TestGroupId");    
dep.setArtifactId("TestDependencyName");    
dep.setVersion("1.0.0");
dependencyList.add(dep);

Dependency dep2 = new Dependency();    
dep2.setGroupId("TestGroupId2");    
dep2.setArtifactId("TestDependencyName2");   
dep2.setVersion("2.0.0");     
dependencyList.add(dep2);       

//model.addDependency(dep);    
model.setDependencies(dependencyList);    
new MavenXpp3Writer().write(writer, model );    
writer.close();

С уважением,
Срикант Правин

1 голос
/ 25 января 2010

Почему вы должны делать это в Java, а не с помощью существующего инструмента, такого как m2eclipse.
См. guide для создания POM для существующего проекта с использованием m2eclipse.

Вы также можете увидеть руководство разработчика m2eclipse , которое позволит вам увидеть исходный код для их реализации.

Ответить ----
Это распространенная проблема, возникающая при попытке создать проект.
Самым большим препятствием является попытка определить правильные maven координаты .
Часто проекты ссылаются на переименованные файлы JAR, где идентификатор группы и номера версий были удалены.

Иногда проверка манифеста в jar-файле дает некоторые подсказки относительно правильного зависимого артефакта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...