Raf*_*ael 10 eclipse android gradle
我有一个问题,通过gradle自动添加依赖项来eclipse安卓项目.我对gradle只有一点点经验.直到现在我已经用gradle构建了两个java项目.一个jar和一个可执行jar.这没有问题.我使用eclipse插件生成eclipse项目并将依赖项添加到构建路径.我向gradle脚本添加了新的依赖项,使用gradle eclipse启动gradle,更新我的项目,并且构建路径中存在依赖项,我可以使用它们.这是该脚本的重要部分.
apply plugin: 'java'
apply plugin: 'eclipse'
repositories {
mavenCentral()
}
dependencies {
compile 'commons-io:commons-io:2.4'
}
Run Code Online (Sandbox Code Playgroud)
所以,现在我尝试结合android插件.这是我的洞gradle脚本.
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.4'
}
}
apply plugin: 'android'
apply plugin: 'eclipse'
repositories {
mavenCentral()
}
dependencies {
compile 'org.apache.commons:commons-lang3:3.1'
}
android {
compileSdkVersion 17
buildToolsVersion "17"
defaultConfig {
minSdkVersion 14
targetSdkVersion 17
}
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
instrumentTest.setRoot('tests')
}
}
Run Code Online (Sandbox Code Playgroud)
如果我使用gradle eclipse没有任何反应.然后我发现java插件将依赖项添加到构建路径.所以我补充道
apply plugin: 'java'
Run Code Online (Sandbox Code Playgroud)
它得到了java插件与android插件不兼容的错误.然后我找到了一个解决方案,将jar自动复制到项目的lib文件夹中.
def libDir = file('libs')
task copyLibs(type: Copy) {
doFirst {
libDir.mkdirs()
}
from configurations.runtime
into libDir
}
Run Code Online (Sandbox Code Playgroud)
但是这个任务也需要配置.runtime的java插件.我需要android插件来创建apk文件,所以它不是一个删除android插件的解决方案.有人知道是否有可能将依赖项添加到与android插件兼容的ecipse项目中的构建路径或lib文件夹中?
编辑:我的一个想法是将java-plugin放到eclipse-plugin中,这样它只会在应用eclipse插件时应用.像这样的东西:
apply plugin: 'eclipse'
eclipse{
apply plugin: 'java'
}
Run Code Online (Sandbox Code Playgroud)
但我仍然得到java和android插件不兼容的错误.也许我理解gradle错误,但通常只有当我启动eclipse插件而不是android插件时才应用java插件.我担心我对gradle的理解和经验不足以解决这个问题,或者理解为什么不可能.
Jav*_*edi 12
我的解决方案基于Rafael,因为它将依赖关系复制到libs目录,该目录仅供Android使用.但是我进一步完全爆炸引用的AAR用于Eclipse.
将以下内容添加到Android项目build.gradle的末尾:
task copyJarDependencies(type: Copy) {
description = 'Used for Eclipse. Copies all dependencies to the libs directory. If there are any AAR files it will extract the classes.jar and rename it the same as the AAR file but with a .jar on the end.'
libDir = new File(project.projectDir, '/libs')
println libDir
println 'Adding dependencies from compile configuration'
configurations.compile.filter {it.name.endsWith 'jar'}.each { File file -> moveJarIntoLibs(file)}
println 'Adding dependencies from releaseCompile configuration'
configurations.releaseCompile.filter {it.name.endsWith 'jar'}.each { File file -> moveJarIntoLibs(file)}
println 'Adding dependencies from debugCompile configuration'
configurations.debugCompile.filter {it.name.endsWith 'jar'}.each { File file -> moveJarIntoLibs(file)}
println 'Adding dependencies from instrumentTestCompile configuration'
configurations.instrumentTestCompile.filter {it.name.endsWith 'jar'}.each { File file -> moveJarIntoLibs(file)}
println 'Extracting dependencies from compile configuration'
configurations.compile.filter {it.name.endsWith 'aar'}.each { File file -> moveAndRenameAar(file) }
println 'Extracting dependencies from releaseCompile configuration'
configurations.releaseCompile.filter {it.name.endsWith 'aar'}.each { File file -> moveAndRenameAar(file) }
println 'Extracting dependencies from debugCompile configuration'
configurations.debugCompile.filter {it.name.endsWith 'aar'}.each { File file -> moveAndRenameAar(file) }
println 'Extracting AAR dependencies from instrumentTestCompile configuration'
configurations.instrumentTestCompile.filter {it.name.endsWith 'aar'}.each { File file -> moveAndRenameAar(file) }
}
void moveJarIntoLibs(File file){
println 'Added jar ' + file
copy{
from file
into 'libs'
}
}
void moveAndRenameAar(File file){
println 'Added aar ' + file
def baseFilename = file.name.lastIndexOf('.').with {it != -1 ? file.name[0..<it] : file.name}
// directory excluding the classes.jar
copy{
from zipTree(file)
exclude 'classes.jar'
into 'libs/'+baseFilename
}
// Copies the classes.jar into the libs directory of the expoded AAR.
// In Eclipse you can then import this exploded ar as an Android project
// and then reference not only the classes but also the android resources :D
copy{
from zipTree(file)
include 'classes.jar'
into 'libs/' + baseFilename +'/libs'
rename { String fileName ->
fileName.replace('classes.jar', baseFilename + '.jar')
}
}
}
Run Code Online (Sandbox Code Playgroud)
跑 :
"gradle clean build"
您应该在libs目录中找到所有依赖项和爆炸AAR.这是Eclipse应该需要的全部内容.
现在,这是真正的利益开始的地方.从上面的gradle步骤生成libs目录后,您会发现其中也有文件夹.这些新文件夹是build.gradle文件中爆炸的AAR依赖项.
现在最酷的部分是,当您将现有的Android项目导入Eclipse时,它还会将爆炸的AAR文件夹检测为它可以导入的项目!
1.在项目的libs目录下导入这些文件夹,不要导入任何'build'文件夹,它们是由Gradle生成的
2.确保在已添加的所有AAR项目上执行项目 - >清理.在工作区中检查每个AAR爆炸项目在project.properties中是否包含以下内容:
target=android-<YOUR INSTALLED SKD VERSION GOES HERE>
android.library=true
Run Code Online (Sandbox Code Playgroud)
3.现在在您的主Android项目中,您只需使用ADT添加库引用,或者您只需编辑project.properties文件并添加
android.libraries.reference.1=libs/someExplodedAAR/
4.现在,您可以右键单击主Android项目并运行为 - > Android应用程序.
这意味着您不需要任何Android AAR Gradle依赖项的源代码,以便在Eclipse中引用它的类和资源.
上面的gradle构建脚本获取AAR文件并准备在Eclipse中使用.将它添加到工作区后,您就可以专注于实际的主要Android项目了.
您现在可以使用Eclipse进行调试和开发,并使用ADT进行部署,并在APK中正确捆绑AAR依赖项.当你需要制作一些特定的版本时,你可以使用gradle.
| 归档时间: |
|
| 查看次数: |
20572 次 |
| 最近记录: |