Объедините XML-файлы с настраиваемыми правилами (контекст: Maven POMs, Java) - PullRequest
0 голосов
/ 14 апреля 2010

В настоящее время я пишу какой-то препроцессор 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>

при слиянии, а это не то, что мне нужно.

Есть идеи? Спасибо за вашу помощь!

Ответы [ 3 ]

0 голосов
/ 14 апреля 2010

Я думаю, что цель помогает: эффективный пом [1] работает точно так, как вы хотите Даже если нет, Вы можете посмотреть в источниках, как они это сделали.

[1] http://maven.apache.org/plugins/maven-help-plugin/effective-pom-mojo.html

0 голосов
/ 27 августа 2010

У меня нет решения на Java, но если вы заинтересованы в инструменте Windows, Project: Merge прекрасно с этим справится. Вы должны будете сказать ему, какие значения он должен выбрать (потому что это не будет вторым предположением для двусторонних слияний), но он сделает это.

Вы можете настроить спецификацию формата для идентификации элемента, чтобы он знал, как использовать символьные данные внутри для идентификации элементов. Как только это будет сделано, оно должно работать нормально.

0 голосов
/ 14 апреля 2010

Но разве это не вся цель родительского ПОМ? Предоставление значения по умолчанию для большинства используемых элементов?

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