2012-07-25 55 views
3

我已經看到了很多關於此錯誤的線程,但沒有覆蓋我奇怪的場景。首先,基礎知識:Ant構建與「意外頂級異常(已添加)」失敗

我有6個項目,所有這些都縮減模仿我的應用程序的結構和我使用的只是試圖讓構建工作的測試項目。它們的依賴性如下:

  • exampleLib是,不需要任何其他的罐子
    • 包含Widget.java
  • exampleLib2是,不需要任何其他的罐子庫
    • 包含Widget2.java
  • exampleLibNester是需要exampleLibexampleLib2庫
    • 包含WidgetPartDeux.java
  • exampleLibNester2是需要exampleLibexampleLib2庫exampleLibNester
    • 包含WidgetPartDeux2.java
  • exampleUser是需要exampleLibexampleLib2exampleLibNester,和exampleLibNester2應用
    • 包含TheActivity.java
  • exampleTest是一個測試應用程序,儀器exampleUser和要求exampleLibexampleLib2exampleLibNester
    • 包含WidgetTest.java

當我建立使用這些應用程序螞蟻本地在Windows上運行良好,我可以使用install test來運行測試。當我嘗試在運行linux的CI服務器上構建它們時,我遇到了可怕的「已添加」錯誤消息。

-dex: 
    [dex] Converting compiled files and external libraries into /apps/pos360/jenkins/.hudson/jobs/James-Test/exampleLibUser/bin/classes.dex... 
    [dx] 
    [dx] UNEXPECTED TOP-LEVEL EXCEPTION: 
    [dx] java.lang.IllegalArgumentException: already added: Lcom/example/nester/WidgetPartDeux; 
    [dx]  at com.android.dx.dex.file.ClassDefsSection.add(ClassDefsSection.java:123) 
    [dx]  at com.android.dx.dex.file.DexFile.add(DexFile.java:163) 
    [dx]  at com.android.dx.command.dexer.Main.processClass(Main.java:486) 
    [dx]  at com.android.dx.command.dexer.Main.processFileBytes(Main.java:455) 
    [dx]  at com.android.dx.command.dexer.Main.access$400(Main.java:67) 
    [dx]  at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:394) 
    [dx]  at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:245) 
    [dx]  at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:131) 
    [dx]  at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:109) 
    [dx]  at com.android.dx.command.dexer.Main.processOne(Main.java:418) 
    [dx]  at com.android.dx.command.dexer.Main.processAllFiles(Main.java:329) 
    [dx]  at com.android.dx.command.dexer.Main.run(Main.java:206) 
    [dx]  at com.android.dx.command.dexer.Main.main(Main.java:174) 
    [dx]  at com.android.dx.command.Main.main(Main.java:91) 
    [dx] 
    [dx] UNEXPECTED TOP-LEVEL EXCEPTION: 
    [dx] java.lang.IllegalArgumentException: already added: Lcom/example/lib/Widget; 
    [dx]  at com.android.dx.dex.file.ClassDefsSection.add(ClassDefsSection.java:123) 
    [dx]  at com.android.dx.dex.file.DexFile.add(DexFile.java:163) 
    [dx]  at com.android.dx.command.dexer.Main.processClass(Main.java:486) 
    [dx]  at com.android.dx.command.dexer.Main.processFileBytes(Main.java:455) 
    [dx]  at com.android.dx.command.dexer.Main.access$400(Main.java:67) 
    [dx]  at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:394) 
    [dx]  at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:245) 
    [dx]  at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:131) 
    [dx]  at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:109) 
    [dx]  at com.android.dx.command.dexer.Main.processOne(Main.java:418) 
    [dx]  at com.android.dx.command.dexer.Main.processAllFiles(Main.java:329) 
    [dx]  at com.android.dx.command.dexer.Main.run(Main.java:206) 
    [dx]  at com.android.dx.command.dexer.Main.main(Main.java:174) 
    [dx]  at com.android.dx.command.Main.main(Main.java:91) 
    [dx] 2 errors; aborting 

我可以看看類。jar文件並查看該示例LibNester2將這些類拉入其罐子中,但我不知道如何阻止它做到這一點,也不知道爲什麼它在Linux盒子上做,而不是在Windows上做。兩個SDK都已更新到最新版本。

+0

你有沒有讀過[這個線程](http://stackoverflow.com/questions/9513517/unexpected-top-level-exception-after-sdk-update)呢?它有幫助嗎? – yorkw 2012-07-28 08:12:57

+0

Thhanks @yorkw。我讀過一個和其他幾個喜歡它的人。我的問題不僅僅是圖書館。我可以讓那些工作得很好。我的問題是先決條件項目中有嵌套庫。我終於將所有的子庫合併爲一個單獨的項目,但是我會留下這個問題,直到有人知道一個更好的方法時爲止。 – 2012-07-29 14:47:56

+0

我覺得它很有趣,它可以在你的Windows機器上運行,並且不能在你的Linux機器上運行。您是否介意檢查項目的任何'lib'子文件夾中是否有任何垃圾文件?或者,也許你已經確定一切都在使用更新的'libs'機制?也許還可以在每個環境中檢查proguard.jar的版本。 – Joe 2012-08-02 02:24:15

回答

0

據我瞭解,Android版本的項目結構從R14開始改變。

我會建議看看你的項目構建路徑並刪除以_src結尾的所有文件夾: @foxykeep : How to fix the "conversion to Dalvik format failed"。儘管錯誤名稱堆棧跟蹤是相同的錯誤,它看起來像是同樣的問題。

+0

不是。不久前,我們跨越了SDK 14的峯值。這是我們不再立即更新SDK的原因。我們等待大量其他人有機會絆倒谷歌的地雷。 – 2012-08-03 03:06:43

0

在庫項目中構建.jar文件時。不要在文件AndroidManifest.xml中添加任何權限(純AndroidManifest已經足夠)。只需將所需的所有權限添加到主項目Manifest文件中即可。

或者你可以簡單地將你的庫項目導入到你的主項目中,不要使用.jar。