为了给你我想要完成的内容,我将首先描述我的项目结构:
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 进行依赖注入。因此,使用阴影 jar 可以在同一个项目中使用 dagger 1 和 2,因为 shadow 重命名并重新定位了 dagger 2 使用的所有类,例如 @Inject 到 @Inject2。
在库中,一切都按预期工作,因为我使用重定位和重命名的类,如 @Module2、@Inject2 等。
但是在我使用 dagger 1 的应用程序中,标签是 @Inject,@Module,通常在 dagger 1 中使用。因为在我的 build.gradle 中导入的依赖项是 Dagger1。但是当我构建应用程序时,我得到错误指示,我还必须添加修改后的 Dagger 2 标签,如@Module2、@Inject2。这正是我不想要的。
有没有办法使用 gradle 隐藏或忽略这些依赖项,这样应用程序就看不到 dagger 2 的修改后的 jar,但它们仍然可以在库中使用?
到目前为止,我唯一的解决方案是从库中删除 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'