Как распаковать классы зависимостей AAR в Maven?

Я использую Maven, и мне нужно обрабатывать классы из других зависимостей. Перед обработкой классов maven-dependency-plugin используется для распаковки этих зависимостей с целью unpack-dependencies, чтобы затем я мог обрабатывать классы в каталоге target. Все в порядке, пока указанные зависимости упакованы в виде JAR. Теперь я столкнулся с зависимостью AAR, которую необходимо обрабатывать классом особым образом. Ошибка, которую я получаю до сих пор:

Failed to execute goal org.apache.maven.plugins:maven-dependency-plugin:2.10:unpack-dependencies (aars-only) on project app-android: Unknown archiver type: No such archiver: 'aar'. -> [Help 1]

Идентификатор выполнения aars-only исходит из приведенной ниже конфигурации, но в целом он дает ту же ошибку, если не разделить выполнения. Вот моя конфигурация maven-dependency-plugin, которую я позже разделил на два исполнения:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>jars-only</id>
            <phase>process-classes</phase>
            <goals>
                <goal>unpack-dependencies</goal>
            </goals>
            <configuration>
                <includeScope>runtime</includeScope>
                <includeGroupIds>foo-group,bar-group</includeGroupIds>
                <includeTypes>jar</includeTypes> <!-- this is necessary to skip AAR dependencies -->
                <outputDirectory>${project.build.directory}/classes</outputDirectory>
            </configuration>
        </execution>
        <execution>
            <id>aars-only</id>
            <phase>process-classes</phase>
            <goals>
                <goal>unpack-dependencies</goal>
            </goals>
            <configuration>
                <includeScope>runtime</includeScope>
                <includeGroupIds>baz-group</includeGroupIds>
                <includeTypes>aar</includeTypes> <!-- hoping this can process AARs as well, but it's just another execution, nothing special -->
                <outputDirectory>${project.build.directory}/classes</outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

Комментирование выполнения aars-only приводит к сбою приложения во время выполнения, но сборка проходит, поскольку выполнение jars-only включает только тип jar — не совсем то, что мне нужно.

Как распаковать зависимость AAR (baz-group) в каталог target/classes? Можно ли как-то настроить maven-dependency-plugin, чтобы он мог принимать AAR и его упакованный classes.jar? Или есть какой-то другой способ заставить его работать, возможно, просто с помощью другого плагина?

(Может быть, это полезный совет: я также использую com.simpligility.maven.plugins:android-maven-plugin.)


person Lyubomyr Shaydariv    schedule 26.11.2015    source источник
comment
У меня нет установки Maven на этой машине для тестирования, но я бы предположил, что, поскольку на форумах есть несколько тем, указывающих на эту проблему, MDP просто не распаковывает AAR. Если вы можете распаковать его с помощью задачи ANT, встраивание фазы ANT в ваш POM, вероятно, будет лучшим вариантом. AAR должен работать с задачей распаковки ANT.   -  person Alex    schedule 26.11.2015


Ответы (1)


Похоже, что плагин MDP не будет работать с этим напрямую.

Как указано в этой теме - Как преобразовать AAR в JAR, AAR, по сути, представляет собой ZIP-файл с другой архивной информацией.

Здесь я вижу 2 возможных подхода.

1) - Используйте ANT, чтобы разархивировать AAR, найти содержащийся в нем файл jar, а затем также разархивировать с помощью ANT.

2) - Используйте ANT, чтобы разархивировать AAR, как и раньше, затем скопируйте его в промежуточную папку и используйте плагин maven-dependency-plugin для распаковки jar.

https://maven.apache.org/guides/mini/guide-using-ant.html

Я не могу проверить это, но этот фрагмент POM может быть использован в качестве отправной точки.

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.6</version>
<executions>
    <execution>
        <id>prepare</id>
        <phase>build</phase>
        <configuration>
            <tasks>
                <unzip src="source/my_archive.aar" dest="output/" />
                <copy file="output/classes.jar" tofile="my_archive.jar"/>

                <!-- 
                     Either extract the jar here, 
                     or place it where the maven dependencies plugin 
                     can find it, and extract it in a later build phase 
                -->
            </tasks>
        </configuration>
        <goals>
            <goal>run</goal>
        </goals>
    </execution>
</executions>

person Alex    schedule 26.11.2015
comment
Спасибо за ответ. Честно говоря, я стараюсь максимально избегать Apache Ant и даже не ввел maven-antrun-plugin в свой процесс сборки, основанный на более чем 100 модулях, использующих только Maven. Не могу поверить, что я не могу использовать Maven только здесь. Что касается вашей идеи: как мне указать исходный AAR, если предположить, что AAR находится в локальном репозитории? - person Lyubomyr Shaydariv; 26.11.2015
comment
Мне также интересно, есть ли плагин Maven для обработки ZIP-контейнеров. И еще больше интересно, почему maven-dependency-plugin до сих пор не позволяет обращаться с AAR как с обычными зависимостями. Моей первой мыслью было: нет, не могу в это поверить, это должно быть в состоянии сделать это, но да, я также несколько часов гуглил и нашел всего несколько старых тем, жалующихся на отсутствие поддержки. Еще одна мысль заключалась в том, может ли быть расширение для maven-dependency-plugin, аналогичное механизму, который android-maven-plugin использует для раскрытия упаковки aar в корне pom.xml. Я расстроен... - person Lyubomyr Shaydariv; 26.11.2015
comment
Я с вами на Ant, это больно использовать! Однако в ряде случаев Maven просто не мог справиться с конфигурацией, которую мы пытались использовать. Я использовал Ant с maven для распаковки двоичных файлов C ++ из архива до сборки, которая использовала ant для перемещения zip и его извлечения. Если вы добавляете AAR как обычную зависимость в Maven, то с помощью и задачи Ant разархивируйте файлы с расширением .aar. Это должно дать вам банки в каталоге сборки. Прошло некоторое время с тех пор, как я сделал это, поэтому я извиняюсь за то, что это не очень ясно. - person Alex; 26.11.2015
comment
Плагина зависимостей maven должно быть достаточно для извлечения zip, но поскольку ему не нравится тип архива AAR (независимо от того, что это действительно просто zip), Ant может быть лучшим вариантом. Я согласен, Maven должен просто справиться с этим, но если ваша сборка событий немного неортодоксальна, ant дает более тонкий контроль. Это может быть возможно с плагином maven-dependency-plugin, но вам нужно будет извлечь aar, чтобы получить банки, а затем извлечь банки на другом этапе. - person Alex; 26.11.2015
comment
Спасибо за комментарии, Алекс. И, наверное, последний вопрос, пожалуйста: как мне указать точный атрибут src для задачи unzip, предполагая, что готовый к распаковке исходник находится в репозитории (проще говоря, просто получить абсолютный путь AAR в локальном репозитории) ? Кажется, я слеп, чтобы понять, как это сделать. - person Lyubomyr Shaydariv; 26.11.2015
comment
Вам не нужно будет получать путь к AAR в репо, просто добавьте AAR в качестве зависимости. Когда maven создаст проект, артефакт будет загружен из вашего локального репозитория в каталог сборки maven. Как только он появится, вы можете сослаться на него через задачу ant, поэтому вы будете указывать на файл aar в каталоге сборки вашего проекта. Копировать вкус во фрагмент POM можно использовать для перемещения AAR или извлеченных JAR-файлов туда, где они нужны maven. - person Alex; 26.11.2015
comment
Извините, но у меня на данный момент не настроена система разработки Java после перехода на C#, поэтому у меня нет возможности проверить это. Этот подход должен работать, но вам могут понадобиться пробы и ошибки. Я использовал этот метод раньше при создании проекта, который полагался на ряд библиотек C++. Они были загружены из репозитория, упакованы в zip и извлечены в каталог сборки с помощью задачи ant, а другая задача ant упаковала их в банку для распространения. Мы пытались сделать то же самое в чистом maven, но потеряли неделю, пытаясь заставить это работать. - person Alex; 26.11.2015
comment
У меня только что получилось. К счастью, ${project.build.directory}/unpacked-libs создается android-maven-plugin и каталог доступен на фазе process-classes (к тому же не очень удобно настраивать атрибут src (он называется динамически). Это несколько расходится с тем, что вы говорите о скопированных артефактах (и для этого и есть maven-dependency-plugin), но мне этого вполне достаточно, и работает он блестяще!Вы спасатель, Алексей.Спасибо! :) - person Lyubomyr Shaydariv; 26.11.2015
comment
Вот мой maven-antrun-plugin фрагмент: <unzip src="${project.build.directory}/unpacked-libs/$MY_LIB_NAME/classes.jar" dest="${project.build.directory}/classes"><patternset><exclude name="META-INF"/><exclude name="META-INF/*"/></patternset></unzip> - person Lyubomyr Shaydariv; 26.11.2015
comment
Ааа, так плагин для Android уже извлек его! Я не понял, что это сделало это. Я рад, что смог указать вам правильное направление, мне просто жаль, что я не мог быть более конкретным в своем ответе, но тем не менее, пожалуйста. - person Alex; 26.11.2015