有可能让同一个库的两个不同版本共存吗



我正在开发一个react原生应用程序,它可以播放音频和视频文件。所以我使用了两个javascript依赖项:react-native-track-playerreact-native-video

就个人而言,他们工作得很好。不过在一起。。。

07-23 09:41:24.052 24644 24644 E AndroidRuntime: FATAL EXCEPTION: main
07-23 09:41:24.052 24644 24644 E AndroidRuntime: Process: com.myapp, PID: 24644
07-23 09:41:24.052 24644 24644 E AndroidRuntime: java.lang.NoSuchMethodError: No virtual method setAudioAttributes(Lcom/google/android/exoplayer2/audio/AudioAttributes;)V in class Lcom/google/android/exoplayer2/SimpleExoPlayer; or its super classes (declaration of 'com.google.android.exoplayer2.SimpleExoPlayer' appears in /data/app/~~JZaWLKING3kOoM2Xhy3b8g==/com.myapp-ZiTzxTcb_NCKba7M-tUmIw==/base.apk!classes2.dex)

经过一些研究,这似乎是由于版本不匹配,因为它们都依赖于exoplayer

  • react-native-video
dependencies {
implementation('com.google.android.exoplayer:exoplayer:2.13.2') {
exclude group: 'com.android.support'
}
}
  • react-native-track-player
def safeExtGet(prop, fallback) {
rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback
}
dependencies {
def exoPlayerVersion = safeExtGet("exoPlayerVersion", '2.11.4')
implementation "com.google.android.exoplayer:exoplayer-core:${exoPlayerVersion}"
}

react-native-track-player似乎回到了2.11.4:如果我硬编码版本号而不是调用safeExtGet,我可以观察到同样的崩溃。

奇怪的是,在构建时没有错误(或警告!(。当使用android Studio查看react-native-track-playerandroid代码时,setAudioAttributes是一个有效的方法(至少IDE没有报告错误(。

我的问题是:

  1. 是否可以让同一个库的两个不同版本共存,并将Java代码正确链接到库中使用的任何版本?(在这种情况下:exoplayer(
  2. 如果可能的话,我观察到的行为可能来自这些项目的build.gradle文件中的一些设置吗
  3. 如果不可能,默认行为是什么"保持较高版本的静音">

提前感谢。

在与一些人讨论了这个问题后,似乎不可能拥有同一库的两个不同版本。这似乎是JVM的一个限制,Maven、Gradle和Sbt在遇到这个问题时都有不同的行为。

最让我惊讶的是,Gradle在不通知我的情况下,悄悄地用较高的版本覆盖较低版本的依赖关系,这会导致不同的运行时API,从而崩溃。

我通过将我的react-native-track-playerexoplayer依赖版本移植到2.13.2来解决这个问题,并且只需要对源代码进行一些小的更改。

最新更新