linux下将eclipse项目转换为gradle项目
本文针对于在linux环境下,不使用eclipse而把一个eclipse项目转换为gradle默认结构的项目的情况,脚本可能在mac下也适用,未验证。
windows中的转换问题,以及使用eclipse进行导出再导入到android studio的问题均不在此讨论之内。
本文原创,转载请注明出处:
http://blog.csdn.net/maosidiaoxian/article/details/48517275
前些天在网上找到了一个库,可它是一个eclipse项目,并且有两年没更新了,习惯了使用远程依赖的管理方式的我就想把它转成一个Gradle构建的项目,并且是Android Studio中默认使用的项目结构,试了几次均不成功。于是在github上搜索,居然找到了一个老外的项目,里面有实现这个需求的脚本。项目地址:https://github.com/saadfarooq/android-migrate-gradle
不过这个项目老外也是两年没更新了,使用的Android Gradle Plugin版本还是0.4的,并且还有其他问题。二话不说,clone下来,自己修改了几次,终于改好了一个较为完善的脚本,虽还有一些瑕疵,等下说明。
我改完的脚本如下:
echo -n "include " > settings.gradle;
# Loop through the sub-project directories
for dname in `find -name src`;do
# Remove ant stuff
echo "Removing adt generated folders";
rm -rf $dname/../bin;
rm -rf $dname/../gen;
plugin="apply plugin: 'com.android.application'"
if grep -Fxq "android.library=true" $dname/../project.properties; then
plugin="apply plugin: 'com.android.library'"
fi
dependencies=`cat $dname/../project.properties |sed -n "s/android.library.reference.*=..\/\(.*\)/ compile project(':\1')/p"`
echo "Creating; src directory" $dname/main;
mkdir $dname/main;
echo "Creating java src directory" $dname/main;
mkdir $dname/main/java;
# Copy old stuff to new paths
echo "Copying Manifest from " $dname/../ to $dname/main;
cp $dname/../AndroidManifest.xml $dname/main/;
echo "Moving code to new 'main' folder";
for srcs in `ls $dname`; do
[[ $srcs != "main" ]] && mv $dname/$srcs $dname/main/java \
&& echo "Movings source dir "$srcs ;
done
# Create test directory
echo "Creating test directory" $dname/test;
mkdir $dname/test;
echo "Moving resources to new 'resource' folder " $dname/main/res ;
mv $dname/../res $dname/main/;
echo "Removing unnecessary files";
for file in `ls $dname/../`; do
[[ -f $dname/../$file ]] && rm $dname/../$file;
done
[[ -f build.gradle.template ]] && \
echo "Copying gradle build file to modules" && \
cp build.gradle.template $dname/../build.gradle
# Create the default build.gradle file
echo "Write gradle build file to modules";
echo "$plugin
android {
compileSdkVersion 23
buildToolsVersion \"23.0.0\"
defaultConfig {
minSdkVersion 7
targetSdkVersion 22
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
$dependencies
}
" > $dname/../build.gradle;
# Add current project to settings.gradle
echo -n \':`dirname ${dname##*./}`\' >> settings.gradle;
# Final comments
echo "Processing of " $dname "done. ";
echo;
done
# Remove the last "," in settings.gradle
sed -i "s/''/', '/" settings.gradle;
# Add all project configuration to build.gradle in project root directory.
echo "Write gradle build file to root project.";
echo "buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.3.0'
}
}
allprojects {
repositories {
jcenter()
}
}
" > build.gradle;
# Copy Gradle stuff from ANDROID_HOME if possible
if [ -n "$ANDROID_HOME" ] ; then
cp $ANDROID_HOME/tools/templates/gradle/wrapper/* -rf ./;
#Create local.properties
echo "Create local.properties file.";
echo "## This file is automatically generated by Android Studio.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must *NOT* be checked into Version Control Systems,
# as it contains information specific to your local configuration.
#
# Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the
# header note.
#`date`
sdk.dir=$ANDROID_HOME
" > local.properties
fi
# Remove IDE specific files
rm -rf .idea;
这个脚本针对于github上的一些eclipse项目中,有多个project的情况,在有多个project的目录下执行。在Gradle中,对于此类多项目构建,在根项目会有一个settings.gradle以及build.gradle,还有其他的gradle wrapper的文件,比如.gradle/,gradle/,以及gradlew。所以脚本先生成一个settings.gradle文件,里面的内容是:include。接着遍历每个下一层有src目录的文件夹,将其作为一个module进行转换,并把名字加到外面的settings.gradle中,然后生成外面的build.gradle,可能还会生成local.properties文件,从SDK中复制gradle
wrapper的内容。最后是删除.idea目录。这是整个项目的执行过程。详细每一行就不分析了,懂shell命令的也不用我多说。
目前用此脚本对github上的部分使用adt 14以上构建的eclipse项目进行转换后都可以直接构建。不过现在为此已知的问题有:
1. 没有把libs里的support包或appcompat包去掉换成对应的远程依赖。目前似乎不影响构建。
2. 对于子项目非平级结构的多项目,可能转换会有问题。可能存在路径上的问题。
3. gradle wrapper是拷贝自android sdk的,版本可能有点老,而我在build.gradle中声明的Android Gradle Plugin版本是1.3.0,所以会导致用gradlew构建不了,但如果你安装的gradle版本不低的话,直接使用gradle构建没有问题。
4. 如果项目是git项目,没有把gradle项目需要忽略的文件添加到.gitignore中。不影响构建,不过需要手动添加要忽略的文件到.gitignore中。
5. 对于Android Manifest中声明的minVersion和targetVersion,以及versionName和versionCode,package等信息,未能移到build.gradle中来。
目前我fork的项目地址为:https://github.com/msdx/android-migrate-gradle。如果有什么好的提议或解决方法,欢迎提交Pull Request或Issue。
linux下将eclipse项目转换为gradle项目的更多相关文章
- maven项目转换为gradle项目
进入到项目更目录,运行 gradle init --type pom 上面的命令会根据pom文件自动生成gradle项目所需的文件和配置,然后以gradle项目重新导入即可.
- Eclipse中 将java Gradle项目转换为web项目
1.找到项目工作空间目录,打开.project文件,并修改文件, 修改如下: 找到:<natures> </natures>代码段,在代码段中加入如下内容并保存: ...
- 在linux下用tomcat部署java web项目的过程与注意事项
在linux下用tomcat部署java web项目的过程与注意事项 一.安装JDK 到http://www.oracle.com/technetwork/java/javase/downloads/ ...
- 在linux下用tomcat部署java web项目的过程与注意事项(转)
在linux下用tomcat部署java web项目的过程与注意事项一.安装JDK到http://www.oracle.com/technetwork/java/javase/downloads/in ...
- eclipse中 将java项目转换为web项目
来自:http://jadethao.iteye.com/blog/1331308 eclipse中 将java项目转换为web项目 1.找到项目工作空间目录,打开.project文件,并修改文件, ...
- eclipse中 将java项目转换为web项目 博客分类: Tomcat
1.找到项目工作空间目录,打开.project文件,并修改文件, 修改如下: 找到:<natures> </natures>代码段,在代码段中加入如下内容并保存: ...
- Eclipse java项目转换为web项目
1.打开.project文件,并修改文件, 修改如下: 找到:<natures> </natures>代码段,在代码段中加入如下内容并保存: <nature>org ...
- Linux下部署开源版“禅道”项目管理系统《转载》
Linux下部署开源版“禅道”项目管理系统 https://www.cnblogs.com/xxsl/p/6525378.html
- Linux下使用Eclipse开发Hadoop应用程序
在前面一篇文章中介绍了如果在完全分布式的环境下搭建Hadoop0.20.2,现在就再利用这个环境完成开发. 首先用hadoop这个用户登录linux系统(hadoop用户在前面一篇文章中创建的),然后 ...
随机推荐
- NewSQL数据库VoltDB特性简介
VoltDB是一个革命性的新型数据库产品,被称作NewSQL数据库.它基于H-Store,号称比当前数据库产品的吞吐量高45倍,同时又具有很高的扩展性.它的特性主要有以下几点: Ø 高吞吐.低延迟: ...
- 02_IO操作的基本规律(InputStream,OutputStream,Reader,Writer,FileReader,FileWriter,BufferedReader,BufferedWri
模拟BufferedInputStream,编写一个类 package toto.IO; import java.io.IOException; import java.io.InputStre ...
- iOS让软键盘消失的简单方法
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 一些文本输入控件等待输入时会弹出软键盘,我们可以设置这些控件的 ...
- Java基础---Java---IO流-----BufferedReader、BufferedWriter、缓冲区、装饰设计模式及和继承的区别
IO流 IO流用来处理设备之间的数据传输 java对数据的操作是过流的方式 流按操作数据分为两种:字节流与字符流 流按流向分为:输入流,输出流. IO流常用基类 字节流的抽象基类:InputStrea ...
- Android开发优化之——使用软引用和弱引用
Java从JDK1.2版本开始,就把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期.这四种级别由高到低依次为:强引用.软引用.弱引用和虚引用. 这里重点介绍一下软引用和弱引用. 如果 ...
- Hibernate单表操作
单一主键 assigned:由Java应用程序负责生成(即手工的赋值) native:由底层的数据库自动的生成标示符,如果是MySQL就是auto_increment,如果是Oracle就是seque ...
- python 远程调度进程服务与客户端
python 远程调度进程服务与客户端 核心思想: 在本地或远程机器上创建一个进程,提供调度服务.使用了 APScheduler. 安装:APScheduler $ wget https://pypi ...
- Oracle使用游标查询指定数据表的所有字段名称组合而成的字符串
应用场合:参考网上查询数据表的所有字段名代码,使用游标生成指定单个表的所有字段名跟逗号组成的用于select 逗号隔开的字段名列表 from字符串等场合. 查询结果输出如下: 当前数据表TB_UD_ ...
- web中间件切换(was切tomcat)
一.数据源迁移: ①数据源配置在web容器还是在项目本身? 根据开发与生产分离原则选择配置到web容器,以免开发泄露数据库密码. ②数据库密码加密 原先was的数据源直接在console控制,密码是密 ...
- Java学习从菜鸟变大鸟之三 多线程中Thread 和Runnable的区别与运用
多线程机制是java中的一个特点,掌握它对后面的知识的理解至关重要,是java工程师的必备知识,多线程指在单个程序中可以运行多个不同的线程执行的不同的任务,线程是一个程序内部的顺序控制流.进程是静态的 ...