【问题标题】:Maven compilation error for android Project "error: package R does not exist "android项目的Maven编译错误“错误:包R不存在”
【发布时间】:2013-10-30 02:06:37
【问题描述】:

我正在尝试使用 Android 应用程序设置一个 MAVEN 项目。 我有这个 pom 文件

<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.myproject</groupId>
  <artifactId>userprofile</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>userprofile</name>
  <url>http://maven.apache.org</url>
    <dependencies>
        <dependency>
            <groupId>com.google.android</groupId>
            <artifactId>android</artifactId>
            <version>4.1.1.4</version>
            <scope>provided</scope>
        </dependency>

    </dependencies>
</project>

在 MAVEN 编译期间,我收到此错误(大约 100 次,即在我的方法中使用的次数)

    [INFO] -------------------------------------------------------------
    [ERROR] COMPILATION ERROR : 
    [INFO] -------------------------------------------------------------
src\main\java\com\myproject\userprofile\BaseActivity.java:[52,43] error: package R does not exist
    Process finished with exit code 1

关于这个错误的任何想法?在网上,我要么找到关于类似错误输出的未回答问题。我没有使用 MAVEN 的经验,所以我相信我在这里遗漏了一些东西。

【问题讨论】:

    标签: java android maven


    【解决方案1】:

    R 类是在编译期间由您的 IDE 构建的。 MAVEN 找不到 R 类,因为默认情况下可以在 build 文件夹下找到该类。你需要添加这样的东西

    <sourceDirectory>build</sourceDirectory>
    <outputDirectory>target</outputDirectory>
    

    告诉 MAVEN 您在 build 文件夹下有一些资源文件,并且您想让它们可用于编译,因此将它们添加到目标文件夹下,该文件夹将位于您的项目下。

    所以现在我有

    build
      |----res
      |----src
    src
      |----main
           |----java
           |----res 
    target
    

    【讨论】:

      【解决方案2】:

      快速浏览后,我相信您缺少build 元素。 Maven 正在使用当前源构建项目,R 和其他 gen 类尚未生成。至少你需要类似的东西(在dependencies 标签之后):

      <build>
          <finalName>${project.artifactId}</finalName>
          <sourceDirectory>src</sourceDirectory>
          <pluginManagement>
              <plugins>
                  <plugin>
                      <groupId>com.jayway.maven.plugins.android.generation2</groupId>
                      <artifactId>android-maven-plugin</artifactId>
                      <version>3.7.0</version>
                      <extensions>true</extensions>
                  </plugin>
              </plugins>
          </pluginManagement>
          <plugins>
              <plugin>
                  <groupId>com.jayway.maven.plugins.android.generation2</groupId>
                  <artifactId>android-maven-plugin</artifactId>
                  <configuration>
                      <sdk>
                          <!-- platform or api level (api level 16 = platform 4.1)-->
                          <platform>16</platform>
                      </sdk>
                  </configuration>
              </plugin>
          </plugins>
      </build>
      

      另外包装必须是apk:

      <packaging>apk</packaging>
      

      我强烈建议您开始阅读Android Maven documentationsamples

      【讨论】:

      • 每当我将包更改为 apk 时,我都会收到错误 Unknown packaging: apklib @ line 6, column 14
      • that' 因为你需要安装这个 jayway 插件。查看我提供的有关如何安装此 Android maven 插件的链接
      • 这个 jayway 插件是否仅适用于 Eclipse?我使用 Android Studio,但找不到为 AS 安装此插件的方法。再次感谢!
      • 答案是否解决了您的问题?你设法安装了 jayway 吗?它可以从命令行构建吗?喜欢:mvn clean install
      • 不,因为我真的不明白这个 jayway。我该如何安装它。从命令行运行 mvn clean install 我仍然收到错误:包 R 不存在
      【解决方案3】:

      如果你修改了archetype:generate生成的包名,可能会出现这个错误,对我来说,我使用android-quickstart来生成模块结构:

      mvn archetype:generate \
          -DarchetypeArtifactId=android-quickstart \
          -DarchetypeGroupId=de.akquinet.android.archetypes \
          -DarchetypeVersion=1.0.11 \
          -DgroupId=com.yy.android.gameLibs \
          -DartifactId=sample
      

      akquient 建议我使用“com.yy.android.gameLibs”作为包名,我接受了,我成功编译了这个模块并且工作正常。之后,我将包名更改为“com.yy.android.sample”也更改了Androidmenifest.xml包属性,因此模块报告该错误,我自己按照生成命令和选择包名来解决这个问题。

      【讨论】:

        【解决方案4】:

        修改打包成apklib,像这样:

        <packaging>apklib</packaging>
        

        并在 pom.xml 的末尾添加构建目标,如下所示:

        <dependencies>
            <!--Android deps -->
            <dependency>
                <groupId>com.google.android</groupId>
                <artifactId>android</artifactId>
                <version>4.0.1.2</version>
                <scope>provided</scope>
            </dependency>
        </dependencies>
        
        <build>        
            <plugins>
                <plugin>
                    <groupId>com.jayway.maven.plugins.android.generation2</groupId>
                    <artifactId>android-maven-plugin</artifactId>
                    <version>3.8.1</version>
                    <configuration>
                        <sdk>
                            <platform>17</platform>
                        </sdk>
                    </configuration>
                    <extensions>true</extensions>
                </plugin>
            </plugins>
        </build>
        

        【讨论】: