Ошибка компиляции Eclipse при зависимости от внешней apklib

У меня есть несколько проектов библиотеки Android, которые я пытаюсь преобразовать в Maven.

Я столкнулся с проблемой, когда mvn clean install выполняется успешно, но в Eclipse возникают проблемы с импортом, как будто классы в apklib проекта2 не находятся в пути к классам проекта1.

Первый проект POM.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>android-clientsdk</artifactId>
<packaging>apklib</packaging>

<parent>
    <groupId>com.company.client</groupId>
    <artifactId>company-parent</artifactId>
    <version>1.0.0-SNAPSHOT</version>
</parent>

<build>
    <sourceDirectory>src</sourceDirectory>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
        </plugin>
        <plugin>
            <artifactId>maven-source-plugin</artifactId>
            <configuration>
                <attach>true</attach>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>com.jayway.maven.plugins.android.generation2</groupId>
            <artifactId>android-maven-plugin</artifactId>
            <extensions>true</extensions>
            <configuration>
                <sdk>
                    <path>${android.sdk.path}</path>
                    <platform>${android.sdk.platform}</platform>
                </sdk>
                <!-- <deleteConflictingFiles>true</deleteConflictingFiles> -->
            </configuration>
        </plugin>
    </plugins>
    <pluginManagement>
        <plugins>
            <!--This plugin's configuration is used to store Eclipse m2e settings 
                only. It has no influence on the Maven build itself. -->
            <plugin>
                <groupId>org.eclipse.m2e</groupId>
                <artifactId>lifecycle-mapping</artifactId>
                <version>1.0.0</version>
                <configuration>
                    <lifecycleMappingMetadata>
                        <pluginExecutions>
                            <pluginExecution>
                                <pluginExecutionFilter>
                                    <groupId>com.jayway.maven.plugins.android.generation2</groupId>
                                    <artifactId>android-maven-plugin</artifactId>
                                    <versionRange>[3.7.0,)</versionRange>
                                    <goals>
                                        <goal>generate-sources</goal>
                                        <goal>consume-aar</goal>
                                        <goal>proguard</goal>
                                    </goals>
                                </pluginExecutionFilter>
                                <action>
                                    <ignore />
                                </action>
                            </pluginExecution>
                            <pluginExecution>
                                <pluginExecutionFilter>
                                    <groupId>org.apache.maven.plugins</groupId>
                                    <artifactId>maven-dependency-plugin</artifactId>
                                    <versionRange>[2.1,)</versionRange>
                                    <goals>
                                        <goal>copy-dependencies</goal>
                                    </goals>
                                </pluginExecutionFilter>
                                <action>
                                    <ignore />
                                </action>
                            </pluginExecution>
                        </pluginExecutions>
                    </lifecycleMappingMetadata>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>
</build>
<dependencies>
    <dependency>
        <groupId>com.google.android</groupId>
        <artifactId>android</artifactId>
        <scope>provided</scope>
    </dependency>
</dependencies>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>android-clientelement</artifactId>
<packaging>apklib</packaging>

<parent>
    <groupId>com.company.client</groupId>
    <artifactId>company-parent</artifactId>
    <version>1.0.0-SNAPSHOT</version>
</parent>

<build>
    <sourceDirectory>src</sourceDirectory>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
        </plugin>
        <plugin>
            <artifactId>maven-source-plugin</artifactId>
            <configuration>
                <attach>true</attach>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>com.jayway.maven.plugins.android.generation2</groupId>
            <artifactId>android-maven-plugin</artifactId>
            <extensions>true</extensions>
            <configuration>
                <sdk>
                    <path>${android.sdk.path}</path>
                    <platform>${android.sdk.platform}</platform>
                </sdk>
                <!-- <deleteConflictingFiles>true</deleteConflictingFiles> -->
            </configuration>
        </plugin>
    </plugins>
    <pluginManagement>
        <plugins>
            <!--This plugin's configuration is used to store Eclipse m2e settings 
                only. It has no influence on the Maven build itself. -->
            <plugin>
                <groupId>org.eclipse.m2e</groupId>
                <artifactId>lifecycle-mapping</artifactId>
                <version>1.0.0</version>
                <configuration>
                    <lifecycleMappingMetadata>
                        <pluginExecutions>
                            <pluginExecution>
                                <pluginExecutionFilter>
                                    <groupId>com.jayway.maven.plugins.android.generation2</groupId>
                                    <artifactId>android-maven-plugin</artifactId>
                                    <versionRange>[3.7.0,)</versionRange>
                                    <goals>
                                        <goal>generate-sources</goal>
                                        <goal>consume-aar</goal>
                                        <goal>proguard</goal>
                                    </goals>
                                </pluginExecutionFilter>
                                <action>
                                    <ignore />
                                </action>
                            </pluginExecution>
                            <pluginExecution>
                                <pluginExecutionFilter>
                                    <groupId>org.apache.maven.plugins</groupId>
                                    <artifactId>maven-dependency-plugin</artifactId>
                                    <versionRange>[2.1,)</versionRange>
                                    <goals>
                                        <goal>copy-dependencies</goal>
                                    </goals>
                                </pluginExecutionFilter>
                                <action>
                                    <ignore />
                                </action>
                            </pluginExecution>
                        </pluginExecutions>
                    </lifecycleMappingMetadata>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>
</build>
<dependencies>
    <dependency>
        <groupId>com.google.android</groupId>
        <artifactId>android</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>com.company.client</groupId>
        <artifactId>android-clientsdk</artifactId>
        <version>1.0.0-SNAPSHOT</version>
        <type>apklib</type>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.0.1</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.0.1</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.0.1</version>
    </dependency>
</dependencies>

Технические:

  • Я использую Eclipse Kepler.
  • Я использую последнюю версию Android Configurator для M2E (взято с рынка eclipse)

Мой вопрос:

  1. Когда в зависимости от apklib мы должны увидеть какие-либо доказательства этой зависимости в Eclipse (например, .class, скомпилированные из этой библиотеки)?
  2. Почему Eclipse не может найти импорт из пакетов в зависимой apklib?

person Ika    schedule 14.01.2014    source источник
comment
У меня похожая проблема: в то время как в eclipse все выглядит нормально (импорт может быть разрешен и т. д. -> перейти к свойствам проекта -> android -> добавить lib и убедиться, что lib открыт в eclipse в том же рабочем пространстве), произведенный apk не содержит содержимого apklib...........   -  person user1050755    schedule 27.06.2014


Ответы (1)


Вы должны импортировать APKlib в рабочее пространство Eclipse, а затем связать его с основным проектом приложения (Свойства проекта > Android > Добавить библиотеку и выбрать проект APKLib).

Иногда, если вы выполняете очистку или обновление своего проекта maven, Eclipse теряет ссылку на ваш apklib, и вы должны добавить ее снова.

person nbe_42    schedule 14.01.2014
comment
Я попробовал это решение, но оно не решило проблему. Возможно, это связано с тем, что APKLib — это проект Maven, а не стандартная файловая структура Android. (bin не содержит класс). - person Ika; 14.01.2014
comment
Ваш APKlib не распознается как maven и проект Android в вашей рабочей области? В любом случае, в моем случае я добавил свой модуль APKLib в качестве зависимости в свой файл POM. Можете ли вы попробовать добавить его? - person nbe_42; 14.01.2014
comment
APKLib является зависимостью в моем POM.xml, и не только это, Maven успешно создает этот проект, используя mvn clean install. Но когда я хочу кодировать в Eclipse, я вижу, что импорт не работает. Удалось ли вам использовать класс из APKLib в вашем Eclipse? - person Ika; 14.01.2014
comment
Да я сделал это. Но в моем случае модуль maven APKLib также распознается как модуль Android. Поэтому, когда я связываю его как библиотеку Android, Eclipse работает нормально. В проводнике пакетов Eclipse вы видите маленькую букву M и маленькую букву A на значке модуля? - person nbe_42; 14.01.2014
comment
У меня все проекты отмечены буквами A и M. Когда я перехожу к свойствам проекта > Путь сборки Java > вкладка "Библиотеки" > Зависимости Android, я вижу файл jar. он указывает на банку, расположенную в папке bin проекта APKLib. Как мы знаем, когда наши проекты определены как maven, все классы создаются в классах, а jar, на который мы должны ссылаться, находится в целевой папке. Я открыл банку, от которой я зависел, а необходимые классы отсутствовали. - person Ika; 14.01.2014
comment
Некоторое пояснение к приведенному выше комментарию: в обычном проекте Android корзина содержит классы, файлы APK и jar. Если от него зависит другой проект (при условии, что первый проект является проектом библиотеки), то зависимость преобразуется в добавление jar из папки bin и помещение его в путь к классам. Если у нас есть проект Mavnen (android), то bin не содержит необходимых данных. Если бы мы попытались зависеть от файлов jar в target, мы бы вскоре обнаружили, что есть только классы и нет ресурсов или R-файла. Я ожидаю, что плагин e2m для Android решит эту проблему. - person Ika; 14.01.2014