2012-09-08 24 views
11

Trước hết, có ít nhất 2 bài đăng có cùng vấn đề nhưng các giải pháp này không hoạt động nữa, ít nhất là không cài đặt.java.lang.IllegalArgumentException: đã được thêm: Lorg/hamcrest/BaseDescription; Chuyển đổi sang định dạng Dalvik không thành công với lỗi 1

Tôi đang sử dụng M2E với Eclipse và Android và cố gắng để chạy các ứng dụng như "Ứng dụng Android" bằng cách chọn chạy như-> ứng dụng Android, nhưng tôi luôn luôn nhận được lỗi này:

UNEXPECTED TOP-LEVEL EXCEPTION: java.lang.IllegalArgumentException: already added: Lorg/hamcrest/BaseDescription;
. . .

[2012-09-08 19:50:41 - net.mydomain.project-TRUNK] Conversion to Dalvik format failed with error 1

Đó là vấn đề được mô tả here in Tools R14 section. Trước hết, điều này không thể sửa được vì tôi có vấn đề này trong ADT 20.0.3. Thứ hai, tôi không có những cái gọi là "_src" thư mục. Tôi chưa bao giờ thấy chúng trong một dự án Maven trước đây, vì vậy tôi không biết tôi nên làm gì bây giờ. Tôi thậm chí không có bất kỳ thư viện nào liên kết hai lần. Ít nhất tôi không thấy một số trong dự án của tôi. Bất kỳ ý tưởng làm thế nào để có được điều này làm việc?

Đây là pom.xml của tôi nếu điều này giúp:

<?xml version="1.0" encoding="UTF-8"?> 
    <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>net.devgems.android</groupId> 
    <artifactId>kurzparkzonewien</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <packaging>apk</packaging> 
    <name>kurzparkzonewien</name> 

    <properties> 
     <platform.version>1.6_r2</platform.version> 
     <android.sdk.path>/opt/android-sdk-linux</android.sdk.path> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 
    </properties> 

    <dependencies> 
     <dependency> 
      <groupId>com.google.android</groupId> 
      <artifactId>android</artifactId> 
      <version>${platform.version}</version> 
      <scope>provided</scope> 
     </dependency> 

     <dependency> 
      <groupId>com.googlecode.json-simple</groupId> 
      <artifactId>json-simple</artifactId> 
      <version>1.1.1</version> 
     </dependency> 

     <dependency> 
      <groupId>commons-io</groupId> 
      <artifactId>commons-io</artifactId> 
      <version>2.0.1</version> 
     </dependency> 
     <!-- Make sure this is below the android dependencies --> 
     <dependency> 
      <groupId>com.pivotallabs</groupId> 
      <artifactId>robolectric</artifactId> 
      <version>1.0-RC1</version> 
      <scope>test</scope> 
     </dependency> 

     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>4.10</version> 
      <scope>test</scope> 
     </dependency> 
    </dependencies> 

    <build> 
     <outputDirectory>target/classes</outputDirectory> 
     <testOutputDirectory>target/test-classes</testOutputDirectory> 

     <plugins> 
      <plugin> 
       <groupId>com.jayway.maven.plugins.android.generation2</groupId> 
       <artifactId>android-maven-plugin</artifactId> 
       <version>3.1.1</version> 
       <configuration> 
        <androidManifestFile>${project.basedir}/AndroidManifest.xml</androidManifestFile> 
        <assetsDirectory>${project.basedir}/assets</assetsDirectory> 
        <resourceDirectory>${project.basedir}/res</resourceDirectory> 
        <nativeLibrariesDirectory>${project.basedir}/src/main/native</nativeLibrariesDirectory> 
        <sdk> 
         <platform>4</platform> 
         <path>${android.sdk.path}</path> 
        </sdk> 
        <undeployBeforeDeploy>true</undeployBeforeDeploy> 
       </configuration> 
       <extensions>true</extensions> 
      </plugin> 

      <plugin> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>2.3.2</version> 
       <configuration> 
        <source>1.6</source> 
        <target>1.6</target> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 
    </project> 

Tôi đang sử dụng Eclipse Juno, ADT 20.0.3, M2E 1.1.0.

Trả lời

12

Tôi đã tìm thấy giải pháp. Nó phụ thuộc vào phiên bản JUnit, vì JUnit 4.10 thêm thư viện JUnit và thư viện jar hamcrest, mặc dù JUnit 4.10 đã chứa tất cả các lớp hamcrest, vì vậy hamcrest tồn tại hai lần sau đó. Nếu tôi chuyển về JUnit 4.8.1, nó không thêm hamcrest như thư viện và lỗi đã biến mất.

Giải pháp này thực sự là giải pháp thay thế. Thông thường, trình cắm Eclipse Maven sẽ xử lý điều này, nhưng Hamcrest/JUnit là một vấn đề đặc biệt, bởi vì JUnit bao gồm Hamcrest, không phải là sự phụ thuộc, nhưng trong mã.

+2

Phát ngay! Trong trường hợp của tôi, tôi đã cố gắng sử dụng ActionBarSherlock 4.2.0 như một dự án thư viện, và điều đó đã mang JUnit 4.10 như một sự phụ thuộc vào dự án của tôi! Thay đổi JUnit từ 4.10 đến 4.8.1 trong ActionBarSherlock Library pom.xml sửa nó. Cảm ơn rất nhiều! –

+2

Nếu bạn muốn tiếp tục sử dụng 4,10 thì bạn có thể loại trừ một cách rõ ràng bình chứa hamcrest như là một phụ thuộc chuyển tiếp của JUnit. Đây là cách để làm điều đó trong Gradle: instrumentTestCompile ('junit: junit: 4.10') { loại trừ nhóm: 'org.hamcrest' } Xem ở đây cho Maven tương đương: http: // maven. apache.org/guides/introduction/introduction-to-optional-and-excludes-dependencies.html – Brendan

1

Thật không may Eclipse không hiểu phạm vi kiểm tra maven. Nó kéo các lớp hamcrest vào trong bản build với JUnit 4.10. Sử dụng JUnit 4.8.1 hoặc, nếu bạn thực sự cần sử dụng phiên bản 4.10+ của JUnit, bạn có thể sử dụng một hồ sơ maven mà không có junit dep trong nhật thực.

  1. Bao gồm dep JUnit trong cấu hình mặc định và tạo ra một 'không-junit' rỗng hồ sơ (xem ví dụ pom bên dưới)
  2. tính của dự án Eclipse> Maven> Active Maven Hình dạng: Trơn không junit
  3. thủ thêm thư viện junit vào con đường xây dựng nhật thực của dự án của bạn

Dưới đây là phần có liên quan của pom.xml:

<profiles> 
    <profile> 
     <id>default</id> 
     <activation> 
      <activeByDefault>true</activeByDefault> 
     </activation> 
     <dependencies> 
      <dependency> 
       <groupId>junit</groupId> 
       <artifactId>junit</artifactId> 
       <version>4.10</version> 
       <scope>test</scope> 
      </dependency> 
     </dependencies> 
    </profile> 
    <profile> 
     <id>no-junit</id> 
    </profile> 
</profiles> 
+1

Điểm 3 là một ý tưởng rất tồi. Đây là một dự án Maven, vì vậy Maven phải tự quản trị dự án. Nếu bạn bắt đầu thêm thư viện theo cách thủ công, không ai có thể tái tạo lại những gì bạn đã làm. – Bevor

13

Tôi đã thử các giải pháp trên và vẫn gặp lỗi. Chỉ sau một vài lần thử và lỗi, tôi phát hiện ra rằng các lớp hamcrest cũng được chứa trong một cái lọ khác: mockito (Tôi chưa biết rằng mockito sẽ không hoạt động với các bài kiểm tra thiết bị của tôi)

Vì vậy, tôi đã giải quyết được vấn đề bằng cách xóa Mockito-all.jar từ phụ thuộc của tôi và hamcrest loại trừ khỏi sự phụ thuộc bắc cầu của junit như thế này:

<dependency> 
    <groupId>junit</groupId> 
    <artifactId>junit</artifactId> 
    <scope>test</scope> 
    <version>4.10</version> 
    <exclusions> 
     <exclusion> 
      <artifactId>hamcrest-core</artifactId> 
      <groupId>org.hamcrest</groupId> 
     </exclusion> 
    </exclusions> 
    </dependency> 

loại trừ này cũng có thể cần thiết cho commons-đăng (tính đến ngày văn bản) bởi vì nếu không những người xây dựng apk sẽ phản đối về các lớp học cũ.

+0

cảm ơn anh chàng - điều đó đã làm cho tôi! :) – martyglaubitz

+0

Giải pháp duy nhất phù hợp với nhu cầu của tôi. Tôi đã truy cập mọi liên kết trên Google và không có gì. Cảm ơn. – tomrozb

+1

Mỗi https://code.google.com/p/mockito/wiki/DeclaringMockitoDependency#mockito-core_VS_mockito-all Tôi vừa chuyển sự phụ thuộc từ mockito-all sang mockito-core, điều này cũng có tác dụng tương tự với việc loại bỏ hamcrest-core không bị thêm mockito nhưng không phải thêm loại trừ. –

Các vấn đề liên quan