我在一个Android应用程序的单独项目中有一个单独的Android库。但是,我直接链接库(通过路径或生成的AAR直接引用库模块)时出现以下错误:
A problem was found with the configuration of task ':app:kaptDevelopDebugKotlin'.
> Cannot write to file '/home/m0skit0/Repos/repo/app-android/app/build/intermediates/data-binding/develop/debug/bundle-bin' specified for property 'dataBindingArtifactOutputDir' as it is a directory.
e: error: cannot access ActivityDeparturesBinding
class file for com.blablabla.databinding.ActivityDeparturesBinding not found
Consult the following stack trace for details.
com.sun.tools.javac.code.Symbol$CompletionFailure: class file for com.blablabla.databinding.ActivityDeparturesBinding not found
* What went wrong:
Execution failed for task ':app:kaptDevelopDebugKotlin'.
这将在任务:app:transformDataBindingWithDataBindingMergeArtifactsForDevelopDebug
但是该类确实存在,具有完整的规范名称。它属于该库,并且由两个项目的Android数据绑定处理器正确自动生成(没有任何错误)。该库可以自行正确编译。即使使用--stacktrace
运行编译,也没有进一步的堆栈跟踪。
我尝试将库与编译,实现和api链接在一起,所有这些都具有相同的结果。
Gradle版本为4.4。
更新:
更新到Gradle 5并不能解决问题。重命名XML不能解决问题。
我还发现,仅当我在代码中引用ActivityDeparturesBinding
类时,才会发生该错误,即使从未真正调用过引用它的部分。仅导入而不引用它不会导致错误。
UPDATE2:
这是使用布局的活动:
class DeparturesActivity : BaseVinPlateActivity<DeparturesViewModel, ActivityDeparturesBinding>() {
companion object {
fun getStartIntent(context: Context) = Intent(context, DeparturesActivity::class.java)
}
@Inject
override lateinit var viewModel: DeparturesViewModel
override val layout: Int = R.layout.activity_departures
override fun injectThis(component: ActivityComponent) {
component.inject(this)
}
override fun getToolbarTitleId(): Int = R.string.departures_title
override fun initializeDataBindings(dataBinding: ActivityDeparturesBinding) {
dataBinding.viewmodel = viewModel
}
}
abstract class BaseVinPlateActivity<T: BaseVinPlateViewModel, U: ViewDataBinding> : CompoundsBaseActivity() {
protected abstract var viewModel: T
protected abstract val layout: Int
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == BARCODE_RESULT_CODE_ACTIVITY && resultCode == Activity.RESULT_OK) {
val barcodeResult = data?.getStringExtra(BARCODE_RESULT_ACTIVITY)
viewModel.setBarcodeResult(barcodeResult)
}
}
override fun initializeView() {
super.initializeView()
val dataBinding = inflateDataBinding<U>(layout)
initializeDataBindings(dataBinding)
with (viewModel) {
setBindValidator(Validator(dataBinding))
loadData()
}
}
protected abstract fun initializeDataBindings(dataBinding: U)
}
如果我删除了initializeDataBindings()
函数,该错误消失了。请注意,仅评论函数的主体是不够的,我不得不删除整个函数。
这闻起来像是编译器/工具的错误。
答案 0 :(得分:1)
我们可以通过几种方法(可能还有更多的方法)绕过编译错误。我们想到的最好方法是将抽象函数转换为抽象lambda属性。
父类:
abstract class BaseVinPlateActivity<T: BaseVinPlateViewModel, U: ViewDataBinding> : CompoundsBaseActivity() {
protected abstract val initializeDataBinding: U.() -> Unit
// Rest of code
}
儿童班:
class DeparturesActivity : BaseVinPlateActivity<DeparturesViewModel, ActivityDeparturesBinding>() {
override val initializeDataBinding: ActivityDeparturesBinding.() -> Unit = { viewmodel = this@DeparturesActivity.viewModel }
// Rest of code
}
答案 1 :(得分:0)
我知道已经很晚了,但是我想说类似的事情发生在我身上,在我的情况下,我有一个使用第三方库的库模块,然后在我的应用程序模块中我使用了匕首注入依赖关系,而我遇到这个问题的原因是,我相信dagger找不到此第三方库的类,因为它没有直接在应用程序的依赖关系中实现。因此,在我的案例中,排序方式是更改将第三方库添加到本地库模块中的方式,以便使用api
而不是implementation
。