【问题标题】:Can I use Timber Logger on my java library?我可以在我的 java 库上使用 Timber Logger 吗?
【发布时间】:2018-04-17 10:36:13
【问题描述】:

我将 Timber 依赖项添加到我的 Java 核心库模块 build.gradle 文件中:

implementation 'com.jakewharton.timber:timber:4.6.0'

虽然 gradle 同步时没有报错,但我在 Core Library 中看不到或使用 Timber 类。

【问题讨论】:

  • 你好。你找到替代品了吗?
  • @Michael 不是,我放弃在 java 库中使用木材
  • @Michael 在下面看到我的评论

标签: android logging timber-android


【解决方案1】:

Timber 依赖于 android.util.Log,因此不能在纯 Java 模块中使用。

已提议将库与 A​​ndroid 分离,但库的创建者已决定反对。 https://github.com/JakeWharton/timber/pull/63

Timber 的 5.0.0-SNAPSHOT 版本现在支持使用 jdk 工件在 Java 模块中使用。

<dependency>
  <groupId>com.jakewharton.timber</groupId>
  <artifactId>timber-jdk</artifactId>
  <version>5.0.0-SNAPSHOT</version>
</dependency>

【讨论】:

  • 找到类似的库吗?
  • @BenjaminH 不,我遇到此问题的库模块是针对 Android 应用程序的,因此我将其转换为 Android 库模块而不是 Java 模块。我还没有寻找替代品。
  • 您现在引用的同一个问题说有两个单独的工件:timber-jdktimber-android
【解决方案2】:

如果有人在寻找多模块 android 项目的 Timber(无 android 依赖项)。使用timber-jdk,如下所示。

在项目的build.gradle 文件中。

allprojects {
    repositories {
        maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' }
    }
}

在单个模块build.gradle 文件中(例如:域或远程模块)

implementation "com.jakewharton.timber:timber-jdk:5.0.0-SNAPSHOT"

有了这个你应该能够在没有android框架依赖的情况下实现Timber

【讨论】:

    【解决方案3】:

    如果你有多模块项目,你可以在纯 Java/Kotlin 中使用 Timber,只需要一点抽象,不需要外部库。

    以 Kotlin 和 Koin 为例:

    在纯 kotlin 模块中创建一个大冒名顶替者 Timber.kt:

    interface ILogger {
        fun d(message: String)
        fun e(message: String)
        fun e(throwable: Throwable, message: String)
        fun i(message: String)
    }
    
    object Timber: ILogger, KoinComponent {
    
        private val logger: ILogger by inject()
    
        override fun d(message: String) = logger.d(message)
        override fun e(message: String) = logger.e(message)
        override fun e(throwable: Throwable, message: String) = logger.e(throwable, message)
        override fun i(message: String) = logger.i(message)
    }
    

    在应用模块中创建 TimberLogger.kt:

    import timber.log.Timber
    
    class TimberLogger : ILogger {
    
        override fun d(message: String) = Timber.d(message) // this is real timber this time
        override fun e(message: String) = Timber.e(message)
        override fun e(throwable: Throwable, message: String) = Timber.e(throwable, message)
        override fun i(message: String) = Timber.i(message)
    }
    

    在应用模块中,将 TimberLogger 实现注入您的假 Timber:

    val appModule = module {
    
        single<ILogger> { TimberLogger() }
    }
    

    现在您可以从任何地方简单地静态调用 Timber.d("message")。

    如果您有 2 个以上的纯模块可以在其中使用 Timber,请考虑创建 Utils 模块并将其包含在其余模块中,以便在任何地方都可以使用。

    【讨论】:

    • 功能多一点,完全不需要 Timber
    • 这很好用,除了它会阻止DebugTree 中的自动标签推断算法工作。自动标记现在是“TimberLogger”,因为 DebugTree 检查调用堆栈,如果 Timber 调用被包装,则会更改。
    • @PeterF 您需要从堆栈跟踪中获取正确的标签。您可以通过扩展 DebugTree 来做到这一点:github.com/chrisbanes/tivi/blob/main/base-android/src/main/java/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-11
    • 1970-01-01
    • 2016-06-17
    • 1970-01-01
    • 2011-05-12
    • 2018-03-15
    • 1970-01-01
    相关资源
    最近更新 更多