Gradle lint 和测试构建错误 - JAXBException 和库中的无效包引用

Gradle lint & test build error - JAXBException and Invalid package reference in library

今天我试图将一个 Android 项目添加到 CIRCLE CI 我在 运行 ./gradlew lint 测试作为构建检查经过。问题是我遇到了一些烦人的错误,我花了好几个小时才解决它们:

在我的本地机器上,我得到:java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException

和 CIRCLE CI 抛出以下错误:

The first 3 errors (out of 10) were: /home/circleci/.gradle/caches/modules-2/files-2.1/javax.activation/activation/1.1.1/485de3a253e23f645037828c07f1d7f1af40763a/activation-1.1.1.jar: Error: Invalid package reference in library; not included in Android: java.awt.datatransfer. Referenced from javax.activation.ActivationDataFlavor. [InvalidPackage] /home/circleci/.gradle/caches/modules-2/files-2.1/javax.activation/activation/1.1.1/485de3a253e23f645037828c07f1d7f1af40763a/activation-1.1.1.jar: Error: Invalid package reference in library; not included in Android: java.awt.event. Referenced from com.sun.activation.viewers.TextEditor. [InvalidPackage] /home/circleci/.gradle/caches/modules-2/files-2.1/javax.activation/activation/1.1.1/485de3a253e23f645037828c07f1d7f1af40763a/activation-1.1.1.jar: Error: Invalid package reference in library; not included in Android: java.awt. Referenced from com.sun.activation.viewers.ImageViewer. [InvalidPackage]

我在我的 android 项目中使用数据绑定,以及 livedata 和 androidx。我已经在网上搜索了几个小时,但没有任何帮助。我试图通过以下方式消除错误:

lintOptions { abortOnError true lintConfig file("lint.xml") }

和lint.xml:

<lint>
<issue id="InvalidPackage">
    <ignore path="**/activation*.jar"/>
</issue>
</lint>

在此先感谢您的帮助。如果需要,请询问更多信息!

@Gabi 我能够在 public github repo + circleci 中复制这个问题,并解决它。

请查看以下Public android-实践github repo 提交历史:https://github.com/ejparz/android-practice/commits/master

作为这次提交的一部分,我得到了相应的 CircleCi 构建正常工作。

提交https://github.com/ejparz/android-practice/commit/b5f4b20a2adc3ef828153b39869f766ee7e9920e

构建https://circleci.com/gh/ejparz/android-practice/6


然后我添加了一个无效的包(javax.activation:activation),在相应的circleci build中得到了和你一样的错误

提交https://github.com/ejparz/android-practice/commit/ca6f502170439e28cbcf269eac302369a282d7d0

构建https://circleci.com/gh/ejparz/android-practice/7

请注意构建中存在与您报告的相同的错误 错误:库中的包引用无效;未包含在 Android 中:java.awt.datatransfer。参考自javax.activation.ActivationDataFlavor


然后,我通过在 应用程序模块的根目录 [=18= 添加一个 lint.xml 文件来修复错误]

提交https://github.com/ejparz/android-practice/commit/7e9f7ca030370570e55c34201fd6f568e049279e

建造https://circleci.com/gh/ejparz/android-practice/8

构建成功!


请注意 lint.xml 文件的位置非常重要。它不能位于项目的根目录。它必须位于模块的根目录(如其他 SO post: 所示)

如果这对你有用,请告诉我。

此错误是由您的 JDK 版本引起的(此 SO 中有更好的解释)

在 Mac 上你可以尝试使用 brew 安装 JDK8 解决问题。

这样做:

  1. 从这个 website
  2. 安装 Brew
  3. 运行brew tap adoptopenjdk/openjdk开启jdk公式(官方已经不可用)
  4. 运行brew cask install adoptopenjdk/openjdk/adoptopenjdk8安装打开jdk8
  5. 运行 brew install jenv 安装 jenv(Java 版本管理器)
  6. 运行 echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.zshrcecho 'eval "$(jenv init -)"' >> ~/.zshrc 如果你使用 ZSH 或 echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.bash_profile 并且 echo 'eval "$(jenv init -)"' >> ~/.bash_profile 如果你使用 BASH
  7. 关闭并再次打开控制台
  8. 运行 jenv add Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home 添加 jdk 版本 8
  9. 运行 jenv versions 列出您安装的版本
  10. 运行jenv global <name of version>换一个

在此 website 中了解有关 jenv 的更多信息,您还可以按文件夹而不是全局配置 java 版本