Есть ли способ ссылаться с помощью Maven на определенные c элементы в зависимости или artifactItem? - PullRequest
1 голос
/ 07 августа 2020

В настоящее время у меня есть pom. xml, который при сборке собирает jar-файлы зависимостей Javado c из mvnrepository и распаковывает их в определенные c папки:

    <build>
        <finalName>${parent.artifactId}</finalName>
        <plugins>
            <plugin>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>unpack-javadoc-jars</id>
                        <goals>
                            <goal>unpack</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <artifactItems>
                        <artifactItem>
                            <groupId>groupid1</groupId>
                            <artifactId>artifactid1</artifactId>
                            <version>1.0.0</version>
                            <classifier>javadoc</classifier>
                            <outputDirectory>${project.build.directory}/dependency-javadoc/artifactid1-1.0.0</outputDirectory>
                        </artifactItem>
                        <artifactItem>
                            <groupId>groupid2</groupId>
                            <artifactId>artifactid2</artifactId>
                            <version>2.0.0</version>
                            <classifier>javadoc</classifier>
                            <outputDirectory>${project.build.directory}/dependency-javadoc/artifactid2-2.0.0</outputDirectory>
                        </artifactItem>
    ...
                        </artifactItems>
                </configuration>
            </plugin>
        </plugins>
    </build>

Дело в том, что , если я не укажу поле каталога вывода для каждого артефакта, javado c будет распакован все в одной папке (которая также настраивается для цели распаковки - https://maven.apache.org/plugins-archives/maven-dependency-plugin-2.6/unpack-mojo.html), и я хочу их быть четко структурированным по папкам. Поэтому я добавил запись в каталог для каждого artifactItem. Однако мне приходится писать имя папки вручную. Есть ли способ сослаться на существующие поля artifactItem примерно так:

                        <artifactItem>
                            <groupId>groupid1</groupId>
                            <artifactId>artifactid1</artifactId>
                            <version>1.0.0</version>
                            <classifier>javadoc</classifier>
                            <outputDirectory>${project.build.directory}/dependency-javadoc/${artifactItem.artifactId}-${artifactItem.version}</outputDirectory>
                        </artifactItem>

Таким образом, я смогу просто скопировать / вставить outputDirectory во все записи артефактов javado c, но будет то же самое. Спасибо!

1 Ответ

1 голос
/ 09 августа 2020

Это интересный вопрос. Я помню, как раньше требовалось использовать объявления 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
...