Это интересный вопрос. Я помню, как раньше требовалось использовать объявления POM в качестве свойств в одном и том же POM, но тогда я жестко закодировал значения, поскольку их было всего несколько. Однако я думаю, что нам здесь не повезло. По крайней мере, с подходом, который пришел мне в голову первым:
Написание плагина Maven, например, POM Strings Maven Plugin (и фактически я сделал это здесь для PO C моего idea) с целью:
pom-strings:toProperties -Dxpath=//artifactItems/*/text()[normalize-space()]
, который находит все XML текстовые узлы (под <artifactItems>
в вашем случае) в POM, затем находит их полные XML пути дерева и создает свойства проекта Maven для них, которые выглядят так:
/project/build/plugins/plugin/configuration/artifactItems/artifactItem/artifactId=...
/project/build/plugins/plugin/configuration/artifactItems/artifactItem/version=...
После объявления его выполнения, например, на этапе initialize
ваших проектов, ваши объявления будут выглядеть (с разрывами строк для облегчения чтения):
<outputDirectory>
${project.build.directory}/dependency-javadoc/
${/project/build/plugins/plugin/configuration/artifactItems/artifactItem/artifactId}
-
${/project/build/plugins/plugin/configuration/artifactItems/artifactItem/version}
</outputDirectory>
Проблема, однако, в этом незаметном, невинном «...
», поскольку в этом случае полные пути не уникальны. Для каждого из них есть два возможных значения. Чтобы решить эту проблему, необходимо ввести ключ (путем поиска первого уникального родителя), чтобы свойства выглядели следующим образом:
/project/build/plugins/plugin/configuration/artifactItems[<key1>]/artifactId=artifactid1
/project/build/plugins/plugin/configuration/artifactItems[<key1>]/version=1.0.0
/project/build/plugins/plugin/configuration/artifactItems[<key2>]/artifactId=artifactid2
/project/build/plugins/plugin/configuration/artifactItems[<key2>]/version=2.0.0
Если этот ключ будет числовым индексом, порядок объявления будет иметь решающее значение, что противоречит декларативной природе POM, и поэтому это не Хороший, а Плохой и Уродливый [1] :
/.../artifactItems[0]/artifactId=artifactid1
/.../artifactItems[0]/version=1.0.0
/.../artifactItems[1]/artifactId=artifactid2
/.../artifactItems[1]/version=2.0.0
Если бы этот ключ быть ассоциативным текстовым ключом, вопрос в том, какое значение следует взять, и если это каким-то образом разрешимо, вам придется сделать то, что вы хотели избежать изначально: жестко закодировать <artifactId>
s (или <version>
s, или что-то еще, обеспечивающее уникальность) :
/.../artifactItems['artifactid1']/artifactId=artifactid1
/.../artifactItems['artifactid1']/version=1.0.0
/.../artifactItems['artifactid2']/artifactId=artifactid2
/.../artifactItems['artifactid2']/version=2.0.0