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

时间:2019-07-17 12:10:27

标签: java android gradle android-databinding circleci

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

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

并在CIRCLE CI上引发以下错误:

  

前3个错误(共10个)是:     /home/circleci/.gradle/caches/modules-2/files-2.1/javax.activation/activation/1.1.1/485de3a253e23f645037828c07f1d7f1af40763a/activation-1.1.1.jar:错误:库中无效的包引用;不包含在Android中:java.awt.datatransfer。从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:错误:库中无效的包引用;不包含在Android中:java.awt.event。引用自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:错误:库中无效的包引用;不包含在Android中:java.awt。从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>

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

2 个答案:

答案 0 :(得分:0)

@Gabi,我能够在公开的github repo + circleci中复制该问题,并解决它。

请参阅以下公开的android-practice 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版本中得到了与您相同的错误

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

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

注意构建与您报告的错误相同 错误:库中的软件包引用无效;不包含在Android中:java.awt.datatransfer。从javax.activation.ActivationDataFlavor 等引用。


然后,我通过在 应用程序模块的根目录

中添加lint.xml文件来修复错误

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

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

现在构建成功!


请注意,lint.xml文件的位置非常重要。它不能走到项目的根本。它必须位于模块的根目录(如该其他SO帖子所述:Firestore: Invalid package reference in library

请告诉我这是否适合您。

答案 1 :(得分:0)

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

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

要这样做:

  1. 从此website
  2. 安装Brew
  3. 运行brew tap adoptopenjdk/openjdk以启用采用开放的jdk公式(该官员不再可用)。
  4. 运行brew cask install adoptopenjdk/openjdk/adoptopenjdk8以安装Open JDK 8
  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版本