【问题标题】:Not to expose the jar file that I depend on不暴露我所依赖的jar文件
【发布时间】:2018-10-08 12:37:49
【问题描述】:

我有一个依赖于某个 lib.jar 的 AAR 库。我将它添加到我的 AAR 中:

dependencies {
    implementation files('myexternallibs/lib.jar')
    ...
}

在生成的 AAR 中,我仍然可以访问 lib.jar 中的类。基于 SO 中的许多答案,关键字 implementation 应该防止这种情况发生。我错过了什么?

【问题讨论】:

标签: android android-gradle-plugin android-library


【解决方案1】:

实现将阻止访问由lib.jar 实现的库,而不是这个库

例如:

Library1
  |-> Class1
  |-> Class2

Library2 (implementation 'Library1')
  |-> Class3 (this library can access Class1 and Class2)

YourProject (implementation 'Library2')
  |-> Main (this library can access Class3, but not Class1 and Class2)

【讨论】:

  • @user1506104 你能定义一下I can still access the classes in lib.jar 是什么意思吗?你能访问 lib.jar 类或它的依赖类吗?
  • 是的,这和我的情况类似。我有 lib.jar (图中的库 1)。它是我的项目的一个依赖项,它通过使用“实现'lib.jar'(图中的库2)生成一个.aar。从那个项目,我可以访问lib.jar的类。当我从这个项目生成一个.aar并在project2(图中的YourProject)中使用它,即使我使用了“implementation project.aar”,我仍然可以从lib.jar访问类。
  • @usee1506104 我认为这是由生成.aar 引起的。我认为实现是为模块和存储库依赖设计的,因为生成 .jar(我不知道 .aar 是否相同)会将所有类放在一起(甚至是继承的类)。
【解决方案2】:

应该使用普通的implementation,以及正确编写和构建的库。

简单地将.jar 代码添加为Java 模块可能是最简单的-

为了提供完全控制哪些方法是可访问的。

请参阅Java Library Plugin

【讨论】:

  • @user1506104 大多数库都没有被混淆;请参阅plugins.jetbrains.com/plugin/7100 - 除非您可以控制它的构建,否则您将无法完全控制可访问的内容;双重包装(如@Martin 所建议)可能是一种选择 - 但似乎有点糟糕。从未尝试过,只是想知道会产生什么影响。
【解决方案3】:

你定义了api吗?

参见 gradle 站点的示例:https://docs.gradle.org/current/userguide/java_library_plugin.html#sec:java_library_separation

dependencies {
    api 'commons-httpclient:commons-httpclient:3.1'
    implementation 'org.apache.commons:commons-lang3:3.5'
}

【讨论】:

    【解决方案4】:

    我将implementation 更改为compileOnly。它奏效了。

    来自documentation的备注:

    如果你使用这个配置,那么你的库模块必须包含一个 检查依赖项是否可用的运行时条件,以及 然后优雅地改变它的行为,这样它仍然可以运行,如果它是 未提供。

    为此,您需要像这样检查类路径:

    try {
        Class.forName("com.company.ClassName");
    }
    catch (ClassNotFoundException ex) {
        // class is not available
    }
    

    【讨论】:

      猜你喜欢
      • 2019-09-28
      • 2016-02-01
      • 2018-12-12
      • 2019-08-24
      • 1970-01-01
      • 1970-01-01
      • 2020-03-24
      • 1970-01-01
      • 2019-07-01
      相关资源
      最近更新 更多