Android Studio中的Base64依赖项问题
在我们当前的项目中,我们正在使用Android Studio 0.6.1和Gradle plugin 0.11.+,并且我们遇到了一个与Android Studio中的Base64依赖项问题,android,gradle,dependencies,android-studio,Android,Gradle,Dependencies,Android Studio,在我们当前的项目中,我们正在使用Android Studio 0.6.1和Gradle plugin 0.11.+,并且我们遇到了一个与commons codec的依赖性问题。我们正在从本地Artifactory实例中引入一个依赖类,该类包含一个“crypto”服务,该服务使用以下两行代码: byte[] encryptedOutput = cipherFactory.getEncryptCipher().doFinal(plaintext.getBytes()); byte[] encrypt
commons codec
的依赖性问题。我们正在从本地Artifactory实例中引入一个依赖类,该类包含一个“crypto”服务,该服务使用以下两行代码:
byte[] encryptedOutput = cipherFactory.getEncryptCipher().doFinal(plaintext.getBytes());
byte[] encryptedCipherText = Base64.encodeBase64URLSafe(encryptedOutput);
问题是,即使我们在Gradle配置中定义了commons codec
的特定依赖项,我们也会得到以下异常
java.lang.NoSuchMethodError: org.apache.commons.codec.binary.Base64.encodeBase64URLSafe
起初,我们手动添加了一个对“commons codec:commons codec:1.9”的依赖项,但根据Android Studio,当我深入研究IDE中的代码时,它正在查看1.9中该方法的版本,但当应用程序运行时,我们得到了一个例外。即使将依赖项更改为1.4,它仍然会失败,尽管根据Javadocs,该方法是在该时间可用的。即使完全删除手动依赖项也会导致同样的情况发生
是否有任何方法可以找出running应用程序从何处提取此依赖项?这是我们目前完整的依赖项列表,我无法从这些列表中找到commons codec
compile files('libs/HockeySDK-3.0.2.jar')
compile files('libs/PushIOManager.jar')
compile 'commons-lang:commons-lang:2.6@jar'
compile 'org.codehaus.jackson:jackson-core-asl:1.9.2@jar'
compile 'org.codehaus.jackson:jackson-mapper-asl:1.9.2@jar'
compile 'com.google.android.gms:play-services:4.4.52'
compile 'com.mcxiaoke.volley:library:1.0.4'
compile 'fr.avianey:facebook-android-api:3.14.1@aar'
compile 'javax.validation:validation-api:1.0.0.GA'
我担心的是,这个类被安卓SDK埋在了某个地方,我们将无法覆盖它以使用允许我们使用库的commons codec
版本。即使我们可以做到这一点,我担心这样做可能会导致Android本身出现一些根本性问题。我们可以(而且目前确实)将加密服务类的源代码拉到我们的应用程序中,并对其进行调整以使用相应的等效代码,但这意味着任何时候我们对一个或另一个版本进行更改时,我们都必须保持同步
有什么想法吗
更新:在这种特定情况下,似乎有效的方法是扫描Gradle构建文件中的依赖项,一旦找到您要查找的依赖项,就会使用您想要使用的版本进行覆盖。例如:
def versionOverrides = [
"commons-codec:commons-codec": "1.9",
]
subprojects {
configurations.all {
resolutionStrategy.eachDependency { DependencyResolveDetails details ->
def overrideVersion = versionOverrides[details.requested.group + ":" + details.requested.name]
if (overrideVersion != null && details.requested.version != overrideVersion) {
logger.info "Overriding dependency ${details.requested.group}:${details.requested.name} version ${details.requested.version} --> $overrideVersion"
details.useVersion overrideVersion
}
}
}
}
我担心这个类会被安卓SDK埋在某处
我们将无法覆盖它,无法使用commons编解码器的版本
这将允许我们使用我们的图书馆
这就是正在发生的事情。引导类加载器预先加载了Commons编解码器库1.3版中的类
您可以重新打包(重命名类的包/命名空间)Commons编解码器库以避免此冲突。请参阅我的答案以获得更详细的描述。尝试
gradle dependencies