2011-03-27 97 views
4

我目前正在使用Maven作为构建工具的Android项目。不过,我在包含依赖项时遇到了一个问题,更具体一些:我的pom文件中列出的依赖项没有包含在apk中。这导致ClassDefNotFound错误,当我尝试在我的模拟器上运行应用程序时(Dalvik加载程序中引发了基础ClassNotFound异常)。Android和maven:与apk中的maven依赖关系问题

我使用SpringSource工具套件(2.5.2.SR1),具有以下插件配置:

  • 的Android开发工具(10.0.1.v201103111512-110841)
  • Maven的集成为Android开发工具(0.2.5)
  • Maven的集成为Eclipse(0.12.1.20110112-1712)
  • 的Maven(2.2.1)

这是我的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/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>android-test</groupId> 
    <artifactId>android-test</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>apk</packaging> 
    <name>android-test</name> 

    <properties> 
     <android-platform>10</android-platform> 
     <android-emulator>Android-2.3.3</android-emulator> 
     <android-sdk-path>C:\Program Files\Android\android-sdk</android-sdk-path> 
     <maven-android-plugin-version>2.8.4</maven-android-plugin-version> 
     <maven-compiler-plugin-version>2.3.2</maven-compiler-plugin-version> 
     <android-version>2.3.1</android-version> 
     <spring-android-version>1.0.0.M2</spring-android-version> 
     <jackson-version>1.7.2</jackson-version> 
    </properties> 

    <build> 
     <sourceDirectory>src</sourceDirectory> 
     <finalName>${project.artifactId}</finalName> 
     <plugins> 
      <plugin> 
       <groupId>com.jayway.maven.plugins.android.generation2</groupId> 
       <artifactId>maven-android-plugin</artifactId> 
       <version>${maven-android-plugin-version}</version> 
       <configuration> 
        <sdk> 
         <platform>${android-platform}</platform> 
         <path>${android-sdk-path}</path> 
        </sdk> 
        <emulator> 
         <avd>${android-emulator}</avd> 
        </emulator> 
        <deleteConflictingFiles>false</deleteConflictingFiles> 
        <undeployBeforeDeploy>true</undeployBeforeDeploy> 
       </configuration> 
       <extensions>true</extensions> 
      </plugin> 
      <plugin> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>${maven-compiler-plugin-version}</version> 
      </plugin> 
     </plugins> 
    </build> 

    <dependencies> 
     <dependency> 
      <groupId>com.google.android</groupId> 
      <artifactId>android</artifactId> 
      <version>${android-version}</version> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.android</groupId> 
      <artifactId>spring-android-rest-template</artifactId> 
      <version>${spring-android-version}</version> 
     </dependency> 
     <dependency> 
      <!-- Using Jackson for JSON marshaling --> 
      <groupId>org.codehaus.jackson</groupId> 
      <artifactId>jackson-mapper-asl</artifactId> 
      <version>${jackson-version}</version> 
     </dependency> 
    </dependencies> 

    <repositories> 
     <!-- For testing against latest Spring snapshots --> 
     <repository> 
      <id>org.springframework.maven.snapshot</id> 
      <name>Spring Maven Snapshot Repository</name> 
      <url>http://maven.springframework.org/snapshot</url> 
      <releases><enabled>false</enabled></releases> 
      <snapshots><enabled>true</enabled></snapshots> 
     </repository> 
     <!-- For developing against latest Spring milestones --> 
     <repository> 
      <id>org.springframework.maven.milestone</id> 
      <name>Spring Maven Milestone Repository</name> 
      <url>http://maven.springframework.org/milestone</url> 
      <snapshots><enabled>false</enabled></snapshots> 
     </repository> 
    </repositories> 

</project> 

我的Android清单文件:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="ae.test.android" 
     android:versionCode="1" 
     android:versionName="1.0"> 
    <uses-sdk android:minSdkVersion="10" /> 

    <application android:icon="@drawable/icon" android:label="@string/app_name"> 
     <activity android:name=".MainActivity" 
        android:label="@string/app_name"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

    </application> 
</manifest> 

据我所知,这应该是一个正确的设置。现在的问题是,当我尝试建立这个项目,我得到:

不能在相同的路径添加APK内源文件夹复制文件

我发现this对SO和而解(更改默认输出文件夹的日食到bin而不是target)确实解决了错误,但并没有解决依赖问题。我生成的android文件不包含在目标文件夹中,因此该解决方案对我无用。

是否有其他人有任何设置Android和Maven的经验,如果是这样,你能帮我一下吗?

非常感谢提前!

+1

你是否用maven-android-plugin项目提出了这个缺陷? https://code.google.com/p/maven-android-plugin/issues/entry – 2011-03-28 09:33:20

+0

@Ricardo Gladwell - 还没有,好点!我会在今晚添加它。 – thomaux 2011-03-28 11:00:06

+0

@Ricardo Gladwell - 我已经设法让它工作,需要重新测试,看看我是否可以重现错误(从命令行工作)。如果我能重现这种行为,我会提出缺陷。 – thomaux 2011-03-29 12:52:59

回答

3

我跳过使用Maven集成的Android开发工具(0.2.5),因为eclipse自动构建过程花了很长时间。在这种情况下,我可以将我的默认输出文件夹保留为<project>/target/classes

从命令行构建我的项目工作正常。这些依赖包含在apk文件中。

运行Eclipse中的项目只作品,如果我想补充明确到Eclipse项目的依赖与

Project Properties -> Java Build Path -> Libraries -> Add External JARs... 

这就是苦果我只好忍气吞声(我不是以英语为母语,并希望这句话让sence)。

+0

感谢您的回答。我也相信它与maven-android-plugin中的错误有关,但我需要在本周末重新测试它。如果我能重现这种行为,我会用你的答案。我会更新,当我知道更多 – thomaux 2011-04-01 09:23:13

+1

我不认为它是maven-android-plugin的错误,因为它在命令行上运行良好。这个插件并不声称使用eclipse。据我了解,这个差距应该用m2eclipse-android-integration插件来封闭。不幸的是,这并不适用于eclipse'自动构建'功能。 – FrVaBe 2011-04-01 09:52:56

+0

感谢您的输入!重新测试时我会考虑到这一点。本周六预计会有更新。 – thomaux 2011-04-01 10:12:47

3

使用<scope>compile</scope>作为你的依赖关系,目标系统没有提供它(例如android系统提供了android库),否则maven不会将.class文件从你的依赖项放到apk中。

+0

感谢您的输入。我目前不再使用Android(这是一个非常小的POC项目),但是我会确保在我回到Android编程的那一刻考虑您的建议 – thomaux 2011-09-30 12:57:28

+0

这就是它。我添加了范围编译并解决了问题。谢谢。 – waste 2013-03-21 12:06:09

3

你可以使用 <extractDuplicates>true</extractDuplicates\>android-maven-plugin配置 删除重复的罐子。

+0

谢谢!我目前不再在这个项目上工作,所以我目前无法验证,但这对于未来的参考很有用!在旁注:欢迎来到Stack Overflow! – thomaux 2013-04-25 06:44:05