是否可以隐藏位于&#lib;'内的依赖关系。在aar的文件夹?

时间:2016-09-05 11:07:50

标签: android-studio gradle dagger-2 dagger gradle-shadow-plugin

为了向您提供我想要完成的内容,我将首先描述我的项目结构:

Application
|
| - Library Module
|   |
|   | - Core Library Module
|       | Module 1
|       |- Jar dependency 1
|       |
|       | Module 2
|       |- Jar dependency 2

模块1和模块2,其中包含由shadow gradle插件创建的2个jar文件,用于重定位dagger 2依赖项。这样做是因为应用程序使用Dagger 1并且它们不能在常规基础上同时使用。

核心库模块包含不同库的核心功能,这就是为什么是一个单独的库,它还使用dagger 2进行依赖注入。

库模块包含我们为客户提供给应用程序的功能,它还使用dagger 2进行依赖注入。

现在真正的问题是应用程序,因为它使用Dagger 1进行依赖注入。因此,使用阴影罐,可以在同一个项目中使用匕首1和2,因为阴影重命名并重新定位dagger 2使用的所有类,例如@Inject到@Inject2。

在库中,一切都按预期工作,因为我使用重定位和重命名的类,如@ Module2,@ Inject2等。

但是在我使用dagger 1的应用程序中,标签是@ Inject,@ Module,通常在dagger 1中使用。因为在我的build.gradle中导入的依赖项是Dagger1。但是当我构建应用程序时,我得到了错误指示,我还必须添加修改后的Dagger 2标签,如@ Module2,@ Inject2。而这正是我不想要的。

有没有办法使用gradle隐藏或忽略这些依赖项,因此应用程序无法看到修改后的jar用于dagger 2但它们仍然可以在库中使用?

到目前为止,我唯一的解决方案是从库中删除Dagger 2并自己实现依赖注入,但这很费时而且不完全是我想要的

编辑:

完成错误:

Error:(25, 8) error: com.sample.model.ApplicationModule is listed as a module, but is not annotated with @Module2

编辑2:

  relocate 'javax.inject.Inject', 'javax.inject.Inject2'
  relocate 'javax.inject.Named', 'javax.inject.Named2'
  relocate 'javax.inject.Provider', 'javax.inject.Provider2'
  relocate 'javax.inject.Qualifier', 'javax.inject.Qualifier2'
  relocate 'javax.inject.Scope', 'javax.inject.Scope2'
  relocate 'javax.inject.Singleton', 'javax.inject.Singleton2'
  relocate 'dagger.Lazy', 'dagger.Lazy2'
  relocate 'dagger.MembersInjector', 'dagger.MembersInjector2'
  relocate 'dagger.Module', 'dagger.Module2'
  relocate 'dagger.Provides', 'dagger.Provides2'
  relocate 'dagger.Provides$Type', 'dagger.Provides$Type2'
  relocate 'dagger.internal', 'dagger.internal2'
  relocate 'dagger.producers', 'dagger.producers2'
  relocate 'dagger.Component', 'dagger.Component2'

1 个答案:

答案 0 :(得分:0)

ApplicationModule似乎是一个匕首1模块。错误似乎来自匕首2.所以很明显,匕首2注释处理器在非重命名的@Component上运行。您需要确保处理器仅在dagger 2组件上运行。