背景
比如我们新建了一个项目,名曰Client,因为需要,Client依赖于之前写的某个项目,这么做呢?步骤如下
步骤
1、在Client项目里,导入module
2、在弹出的对话框里,选择源目录,选中import,给模块起个名字(默认是:app,但这个已经被Client占了,就得换个名)
3、然后,在Client的项目结构里,选app模块的依赖标签,点击下面的加号,选择添加模块依赖,点击ok
点击myMoudle,再ok
4、然而并不顺利,报错如下
5、只需要在新建的myModyle的build.gradle中进行如下图的操作就可以了
额外的坑
一般情况下,上面五步就可以导入新的模块并建立依赖。但由于我导入的模块中用了butterKnife黄油刀,就出现了一些额外的错,解决方法记录如下
ButterKnife 错误: 元素值必须为常量表达式
这是由于建立依赖后R类的id少了final字段,解决方法如下:
1、在项目的build.gradle文件里,添加butterknife的依赖,版本要和使用到butterknife的模块(我这儿是myModule)gradle文件里的一致,同时添加mavenCentral()仓库(否则会下载超时),更改完的项目gradle文件如下
buildscript { repositories { google() jcenter() mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:3.0.1' classpath 'com.jakewharton:butterknife-gradle-plugin:8.5.1' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { google() jcenter() mavenCentral() } } task clean(type: Delete) { delete rootProject.buildDir }
注意butterknife的版本不要用8.8及以上的,会报错如下:
> Failed to notify project evaluation listener. > com.android.build.gradle.api.BaseVariant.getOutputs()Ljava/util/List;
2、找到所有用butterknife绑定id的地方,把R.id.xx改成R2.id.xx
@BindView(R2.id.tv_item) TextView textView;
@OnClick(R2.id.btn_share) public void share() { ... }
而后重新构建,完事儿
Error:com.android.builder.dexing.DexArchiveBuilderException:
org.gradle.jvmargs=-Xmx1536m android.enableD8=true
重新构建,完事儿
Error:Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'. > More than one file was found with OS independent path 'META-INF/rxjava.properties'
这个好像是导入模块有RxJava引发的,我的解决方法是把所有模块的gradle文件的android结点下,加这么一段话:
packagingOptions{ exclude 'META-INF/rxjava.properties' }
其中一个模块的gradle文件完整内容如下:
apply plugin: 'com.android.application' android { compileSdkVersion 26 defaultConfig { applicationId "com.example.songzeceng.client" minSdkVersion 24 targetSdkVersion 26 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } packagingOptions{ exclude 'META-INF/rxjava.properties' } } dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation 'com.android.support.constraint:constraint-layout:1.1.0' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' implementation project(':server') implementation project(':myModule') }
其他模块的gradle文件改动类似
结语
可以理解为何单位项目很少添加新的第三方库依赖了,首先要对第三方库改动以适合单位自己的需求,其次由于单位项目模块间的依赖关系比较复杂,添加第三方库依赖容易出现问题,而且改起来成本不低。