В настоящее время я пишу какой-то препроцессор Maven POM, который собирает POM для проекта из нескольких входных файлов (в основном шаблон и специфичный для модуля файл). Файлы упорядочены по иерархии (шаблон = наиболее общий, специфичный для модуля = наименее общий). Теперь проблема состоит в том, чтобы объединить эти файлы в один файл POM.
Короче говоря, или если вы не знакомы с Maven: POM выглядит следующим образом (сокращенно):
<project>
<modelVersion>4.0.0</modelVersion>
<dependencies>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-core</artifactId>
</dependency>
</dependencies>
</project>
По сути, слияние должно заменить все значения более общего файла на значения более конкретного файла (т. Е. Одиночные, например, <modelVersion>
выше), но есть определенные элементы, в которых слияние должно добавить более определенный элемент к родительскому элементу (т. Е. Коллекции, например, элементы <dependency>
должны всегда добавляться к элементу <dependencies>
, и никакой элемент <dependency>
не должен заменяться другим).
Более подробный пример с определением желаемого выхода:
Файл A:
<project>
<modelVersion>A</modelVersion>
<dependencies>
<dependency>
<groupId>groupIdA</groupId>
<artifactId>artifactIdA</artifactId>
</dependency>
</dependencies>
</project>
Файл B:
<project>
<modelVersion>B</modelVersion>
<dependencies>
<dependency>
<groupId>groupIdB</groupId>
<artifactId>artifactIdB</artifactId>
</dependency>
</dependencies>
</project>
Желаемый вывод:
<project>
<modelVersion>B</modelVersion>
<dependencies>
<dependency>
<groupId>groupIdA</groupId>
<artifactId>artifactIdA</artifactId>
</dependency>
<dependency>
<groupId>groupIdB</groupId>
<artifactId>artifactIdB</artifactId>
</dependency>
</dependencies>
</project>
Набор элементов типа коллекции известен и должен быть настраиваемым (предпочтительно с помощью набора выражений XPath).
Приветствуется решение на основе Java.
То, что выглядело наиболее многообещающе до сих пор, так это инструмент, упомянутый здесь , но действие MERGE
производит что-то вроде
<dependency>
<groupId>groupIdAgroupIdB</groupId>
<artifactId>artifactIdAartifactIdB</artifactId>
</dependency>
при слиянии, а это не то, что мне нужно.
Есть идеи? Спасибо за вашу помощь!