android - 在 Jenkins 上编译 Android 项目时如何修复此 ZipException?

标签 android jenkins

我最近将 Jenkins 机器上的 Android SDK 从 rev13 更新到 rev15,并且不得不重做 build.xml 中的一些自定义构建内容以适应 rev14 中所做的更改。我在我的工作站上解决了这个问题,并在期望一切都很好的情况下进行了检查。相反,构建失败并出现以下错误:

-obfuscate:

-dex:
      [dex] Converting compiled files and external libraries into /export/home/hudson/jobs/path/to/the/file/classes.dex...
       [dx] 
       [dx] UNEXPECTED TOP-LEVEL EXCEPTION:
       [dx] java.util.zip.ZipException: error in opening zip file
       [dx]     at java.util.zip.ZipFile.open(Native Method)    
       [dx]     at java.util.zip.ZipFile.<init>(ZipFile.java:127)
       [dx]     at java.util.zip.ZipFile.<init>(ZipFile.java:143)
       [dx]     at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:206)
       [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:95)
       [dx] 1 error; aborting

BUILD FAILED
/opt/android-sdk-linux/tools/ant/build.xml:729: The following error occurred while executing this line:
/opt/android-sdk-linux/tools/ant/build.xml:731: The following error occurred while executing this line:
/opt/android-sdk-linux/tools/ant/build.xml:743: The following error occurred while executing this line:
/opt/android-sdk-linux/tools/ant/build.xml:249: null returned: 1

我可以通过在 Jenkins 工作区目录中直接以 Jenkins 用户身份运行 ant 并使用与 Jenkins 使用的相同的 Android SDK、Ant 和 JDK 来成功构建项目。我什至从 Jenkins 日志中剪切并粘贴了执行行,以确保所有旋钮和开关设置相同。所以问题在于 Jenkins 如何运行构建。

我让 Jenkins 转储环境作为构建的“shell exec”步骤,我看到 LD_LIBRARY_PATH 变量已设置。

LD_LIBRARY_PATH=/u0/jdk1.6.0_29/jre/lib/i386/server:/u0/jdk1.6.0_29/jre/lib/i386:/u0/jdk1.6.0_29/jre/../lib/i386

我在从 shell 运行构建时在我的终端中设置了这个值,它以与 Jenkins 运行时相同的方式失败。啊哈!

问题是我无法弄清楚如何防止设置 LD_LIBRARY_PATH 变量,或指向不会导致此问题的内容。它不是在 Jenkins 用户环境中设置的,我在 Jenkins 配置中找不到任何可能引用它的内容。当我安装更新的 JDK 并更新 /etc/defaults/jenkins 中的 JAVA 值时,它设置的值确实发生了变化,所以它显然是相关的,但不幸的是,行为没有没有任何改进。

我没主意了。有什么帮助吗?

最佳答案

问题原来是由于使用 Jenkins 矩阵构建功能(顺便说一句,这是一个非常好的功能)中涉及的一些配置欺骗,库没有将其 classes.jar 父项目期望找到它的文件,导致报告的错误。那基本上是一个“找不到文件”,但没有这样说。我们仍然不确定 LD_LIBRARY_PATH 与它有什么关系(如果有的话?)。

我的同事调整了主项目和库的 build.xml 文件,以更有力地就输出文件的最终位置达成一致,现在一切都恢复正常了,这让我们松了一口气。

关于android - 在 Jenkins 上编译 Android 项目时如何修复此 ZipException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7935837/

相关文章:

docker - 容器中的GitLab

powershell - 使用 PowerShell 变量作为环境变量

java - 如何跟踪 Jenkins 中的待定构建?

jenkins - 如何在 Jenkins 上更改工作区并构建记录根目录?

android - 带有 Google Drive SDK 的 Play Store 应用程序始终显示 'Choose account' 弹出窗口

java - Jenkins:监控 JUnit 测试执行时间?

java - Android,java定时器只工作一次

java - 如何将库导入到android项目中?

android - 更新 Google Play 上的 apk 文件

java - 非法状态异常,应用程序找不到类中定义的方法