gradle编译java
同学,这个问题的原因找到了,因为3.2的版本比较久远,很多类库已经更新变化了,修改的方法就是到gradle 仓库下的C:\Users\Administrator\.gradle\caches\artifacts-24\mole-metadata\com.lowagie\itext\4.2.2\ 找到ivy.xml 修改
将dependency org="com.itextpdf" name="itextpdf" rev="4.2.2" 修改为dependency dependency org="com.itextpdf" name="itextpdf" rev="5.2.0",
然后将使用了该类的AbstractPdfStamperView、AbstractPdfView的import com.itext 修改为 com.itextpdf。。。
具体原因及说明可以看 去http://www.bdtool.net/blog_356.html 查看。
② minecraft我的世界gradle构建,总是失败,求告诉详细教程。不要发网址,要会的人。不会的
最近在项目中遇到一个不大,但是还蛮烦人的问题,在Maven的约定中,一个标准Java项目的代码结构如下:
project
--src
--main
--java
--resources
--test
--java
--resources
当‘gradle idea’构建intelliJ项目文件时,会自动帮忙设置好所有的Source Root,Test Source Root。但是,在我工作的部门中,我们希望可以把测试分为unit,intg2个类别,这样可以更加容易区分测试的目的,同时提供了Build Pipeline分别运行不同类别测试的能力。因此,我们部门内的标准Java项目结构如下:
project
--src
--main
--java
--resources
--test
--common
--java
--unit
--java
--resources
--intg
--java
--resources
有了这个目录结构之后我们剩下2个问题要解决:
1. 如何区分运行IntegrationTest和Unit Test
2. 如何保证‘gradle idea’以后,无需重新设置Test Source Root。因为gradle不具备识别新的代码结构的能力。
如何写一个Gradle Plugin
语言:
Java,Groovy,Scala都可,推荐用Groovy,毕竟Gradle本质上来说就是一个用Groovy写的DSL,使用Groovy可以更一致一点。
注入方式:
Gradle支持3种形式的定制Plugin注入:
1. 直接把Plugin源代码直接写在Build Script里面。
2. 把Pluigin源代码写到rootProjectDir/buildSrc/src/main/groovy目录下
3. 用一个单独的project来写Plugin源代码,然后以jar依赖的形式注入项目。
个人觉得,都想到要自己写一个Plugin了,那么一定是有多个项目公用这个Plugin了,否则的话,直接把Plugin的代码直接写到脚本里就好了。因此,要定制Plugin,在我看来,一定是需要以一个单独的jar形式注入的。
写project-structure Plugin:
在Gradle中,写一个Plugin非常简单,首先,添加项目依赖,我使用Groovy来写插件,所以添加了localGroovy依赖。
Gradle代码
apply plugin: 'groovy'
dependencies {
compile gradleApi()
compile localGroovy()
}
然后写Plugin的实现代码,实现代码只需要实现Plugin<Project>接口即可,在我的实现代码中,做了两件事,一是定制了项目的代码结构,二是添加了integrationTest Task,该Task只运行*IntegrationTest.class, 这样可以在Build Pipeline分阶段运行Unit Test和IntegrationTest。
Groovy代码
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.tasks.testing.Test
class ProjectStructurePlugin implements Plugin<Project> {
@Override
void apply(Project project) {
project.logger.info "Configuring Project Structure for $project.name"
project.configurations {
integrationTestCompile { extendsFrom testCompile }
integrationTestRuntime { extendsFrom integrationTestCompile, testRuntime }
}
configureSourceSets(project)
addIntegrationTestTask(project)
}
private void addIntegrationTestTask(Project project) {
Test intgTest = project.getTasks().create("integrationTest", Test.class);
intgTest.testClassesDir = project.sourceSets.integrationTest.output.classesDir
intgTest.includes = ["**/*IntegrationTest.class"]
intgTest.inputs.dir 'src'
intgTest.outputs.dir project.sourceSets.integrationTest.output.classesDir
project.check.dependsOn project.integrationTest
intgTest.dependsOn project.test
}
private void configureSourceSets(Project project) {
project.sourceSets {
test {
java {
srcDir 'src/test/unit/java'
srcDir 'src/test/common/java'
}
resources {
srcDir 'src/test/unit/resources'
}
}
integrationTest {
java {
srcDir 'src/test/intg/java'
srcDir 'src/test/common/java'
}
resources {
srcDir 'src/test/intg/resources'
}
compileClasspath = project.sourceSets.main.output + project.sourceSets.test.output + project.configurations.integrationTestCompile
runtimeClasspath = output + compileClasspath + project.configurations.integrationTestRuntime
}
}
}
}
接着,在项目的src/main/resources/META-INF/gradle-plugins目录下,创建一个文件:<plugin-name>.properties,在该文件中指定Plugin的实现类:
Java代码
implementation-class=com.xianlinbox.plugins.ProjectStructurePlugin
在项目中使用该Plugin
首先,需要在build.gradle脚本中引入该Plugin的jar包依赖,可以是以文件的形式,当然个人更推荐的是把jar包发布到Maven库中,以Maven依赖的形式的注入,本例中使用的是本地文件依赖:
Groovy代码
buildscript {
dependencies {
classpath fileTree(dir: 'libs', include: '*.jar')
}
}
然后,注入编写的插件,注意,该插件必须和java plugin一起使用,因为其中使用到SourceSets属性是从该插件中引入进来的:
Groovy代码
apply plugin: 'java'
apply plugin: 'project-structure'
有了这个插件之后,就可以通过‘gradle test’和‘gradle integrationtTest’区别运行UnitTest和IntrgrationTest了。
最后,解决自动设置Test Source Root的问题,只需要在build.gradle为ideaMole Task增加识别Test Source Root的能力即可:
Groovy代码
apply plugin: 'idea'
...
idea {
mole {
testSourceDirs += file('src/test/intg/java')
testSourceDirs += file('src/test/intg/resources')
}
}
当然,我们也可以把它写到Plugin中去,在设置为Project-Structrue之后:
Groovy代码
......
compileClasspath = project.sourceSets.main.output + project.sourceSets.test.output + project.configurations.integrationTestCompile
runtimeClasspath = output + compileClasspath + project.configurations.integrationTestRuntime
project.idea {
mole {
testSourceDirs = testSourceDirs + new File('src/test/intg/java') + new File('src/test/intg/resources')
}
}
1、安装
Gradle安装和Maven一样方便,只需要,下载(http://www.gradle.org/downloads )==》解压==》配置环境变量(GRADLE_HOME & PATH),配置好环境变量之后记得使用 source命令使新的环境变量生效。配置成功之后,可以在命令行通过 “gradle -v"验证是否安装成功。
2、Gradle编译Maven风格的java项目
首先,在项目根目录创建"build.gradle"文件,编译java项目需要使用gradle的java插件
Groovy代码
apply plugin: 'java'
,因为要集成maven的功能,需要添加maven插件
Groovy代码
apply plugin: 'maven'[
。
接着,配置项目的Repository,风格如下
Groovy代码
repositories{
mavenCentral();
}
,上面例子使用的是默认的maven的中央库,如果想用自己的本地库,可通过如下方式配置
Groovy代码
def localMavenRepo = 'file://' + new File(System.getProperty('user.home'), '.m2/repository').absolutePath
repositories {
// Use local Maven repo location. We don't need this if we only want to install
// an artifact, but we do need it if we want to use dependencies from the local
// repository.
mavenRepo urls: localMavenRepo
mavenCentral()
}
再然后,配置项目依赖的第三方库,配置模板如下:
Groovy代码
dependencies{
compile group: '<group-id>',name:'<artifact-id>',version:'<version>'
}
,举个例子,假设项目依赖了4.10版本的junit,那么配置就是
Groovy代码
compile group: 'junit',name:'junit',version:'4.10'
另外Depencies还可以按如下方式简写
Groovy代码
compile '<group-id>:<artifact-id>:<version>'
例子
Groovy代码
compile 'junit:junit:4.10'
最后,如何把自己的项目发布到Repository中,
Groovy代码
uploadArchives {
repositories {
mavenDeployer {
repository(url: "file://localhost/tmp/myRepo/")
}
}
③ 如何用jenkins+gradle一次性构建多个java工程
根据需要,从官网下载最新jenkins软件包,同时下载最新的gradle软件包,jenkins插件,设置好环境变量,配置好端口,启动。点击新建任务输入项目名称和使用的jdk,同时还输入节点,不输入默认为master节点选择源码管理工具为CVS,Git或subversion,根据自身情况而定,然后填写URL路径@HEAD在构建一栏里增加构建步骤选择InvokeGradlescript,同时选择你的GradleVersion,Switches,RootBuildscript,对于多工程,需要添加多个InvokeGradlescript上传脚本:在每个子工程的根目录下放置名为gradle.build的脚本点击步骤1里面截图的立即构建,通过ConsoleOutput查看结果
④ Gradle--多环境编译打包
前段时间产品经理提了个需求,测试环境,预发布环境,生产环境编译下的app需要在同一步手机同时存在,实现是可以的,但是得有三个环境下的不同applicationId,网络地图key,域名,桌面logo,刚开始是想需要什么环境就换什么类型,很麻烦,每次都要换一次重新编译,我就在想有什么便捷的方法一键设置更换,gradle其中的Flavors功能可以实现我想要的。
这个是主项目中build.gradle中的配置,有三个环境我命名为 xiaoming_test,xiaoming_ready,xiaoming_proct,并有不同的applicationId,BAIDU_MAP_KEY,HTTP_HEAD,HTTP_HEAD_JAVA,app_icon,(解释一下,有两条域名是因为后面后台是用java开发而做的区分),到这里应该大家有疑问,举个栗子,我们一般开发的第三方key是在mainifests进行注册申请的,而我们gradle如何去引用资源的。这里有两种引用方式,直接引用,自定义引用。
引用logo在application的icon属性命名为app_icon,$表示引用这个命名,对应的是gradle的配置。
在mainifests自定义为HTTP_HEAD,value值通过${HTTP_HEAD}引用,getHttpHead()获取自定义注册的域名值。从而实现每次请求对应的域名,只需在gradle里设置。
只需打开studio的BuildVariarts设置,选择需要的环境即可重新编译不同的apk,方便快捷的做到一键设置快速打包。
⑤ Gradle编译-APK编译过程
在早期的Android设备中(Android5.0以下)都是使用的Dalvik虚拟机,Dalvik支持经过转换的.dex文件。.dex格式是专为Dalvik设计的一种适合内存和处理器速度有限的系统。
但是在Android5.0,google用ART全面取代的Dalvik。Android7.0中又添加了JIT编译器,使得Android性能也有不少提升。
上图为从Android源文件开始,最终到APK的过程。
下面博客文章详细介绍了dalvik虚拟机,可供参考学习。
https://www.cnblogs.com/lao-liang/p/5111399.html
dvm(art)和jvm属于不同的虚拟机平台,不同平台要求执行的文件类型也就不一样
dvm(art)--.dex文件
jvm--.class文件
在编译和生成上
java source --.class文件 ---jvm执行
java source --.class文件 ---.dex文件 --- dvm执行
Android Runtime (ART) 是 Android 上的应用和部分系统服务使用的托管式运行时。ART 及其前身 Dalvik 最初是专为 Android 项目打造的。作为运行时的 ART 可执行 Dalvik 可执行文件并遵循 Dex 字节码规范。
ART 和 Dalvik 是运行 Dex 字节码的兼容运行时,因此针对 Dalvik 开发的应用也能在 ART 环境中运作。不过,Dalvik 采用的一些技术并不适用于 ART。
ART的功能
1.预先 (AOT) 编译
使用ART编译器时,应用程序在安装期间就已经把dex字节码翻译并存储在设备上,运行时,只需要执行这些翻译好的就可以了,因此执行速度也快了不少。
2.垃圾回收方面的优化
3.开发和调试方面的优化
构建流程涉及许多将项目转换成 Android 应用软件包 (APK) 的工具和流程。构建流程非常灵活,因此了解它的一些底层工作原理会很有帮助。
⑥ gradle配置不成功,求助贴
近项目遇蛮烦问题Maven约定标准Java项目代码结构:
project
--src
--main
--java
--resources
--test
--java
--resources
‘gradle idea’构建intelliJ项目文件自帮忙设置所Source RootTest Source Root我工作部门我希望测试unitintg2类别更加容易区测试目同提供Build Pipeline别运行同类别测试能力我部门内标准Java项目结构:
project
--src
--main
--java
--resources
--test
--common
--java
--unit
--java
--resources
--intg
--java
--resources
目录结构我剩2问题要解决:
1. 何区运行IntegrationTestUnit Test
2. 何保证‘gradle idea’需重新设置Test Source Rootgradle具备识别新代码结构能力
何写Gradle Plugin
语言:
JavaGroovyScala都推荐用Groovy,毕竟Gradle本质说用Groovy写DSL使用Groovy更致点
注入式:
Gradle支持3种形式定制Plugin注入:
1. 直接Plugin源代码直接写Build Script面
2. Pluigin源代码写rootProjectDir/buildSrc/src/main/groovy目录
3. 用单独project写Plugin源代码jar依赖形式注入项目
觉都想要自写Plugin定项目公用Plugin否则直接Plugin代码直接写脚本要定制Plugin我看定需要单独jar形式注入
写project-structure Plugin:
Gradle写Plugin非简单首先添加项目依赖我使用Groovy写插件所添加localGroovy依赖
Gradle代码
apply plugin: 'groovy'
dependencies {
compile gradleApi()
compile localGroovy()
}
写Plugin实现代码实现代码需要实现Plugin接口即我实现代码做两件事定制项目代码结构二添加integrationTest Task该Task运行*IntegrationTest.class, Build Pipeline阶段运行Unit TestIntegrationTest
Groovy代码
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.tasks.testing.Test
class ProjectStructurePlugin implements Plugin {
@Override
void apply(Project project) {
project.logger.info "Configuring Project Structure for $project.name"
project.configurations {
integrationTestCompile { extendsFrom testCompile }
integrationTestRuntime { extendsFrom integrationTestCompile, testRuntime }
}
configureSourceSets(project)
addIntegrationTestTask(project)
}
private void addIntegrationTestTask(Project project) {
Test intgTest = project.getTasks().create("integrationTest", Test.class);
intgTest.testClassesDir = project.sourceSets.integrationTest.output.classesDir
intgTest.includes = ["**/*IntegrationTest.class"]
intgTest.inputs.dir 'src'
intgTest.outputs.dir project.sourceSets.integrationTest.output.classesDir
project.check.dependsOn project.integrationTest
intgTest.dependsOn project.test
}
private void configureSourceSets(Project project) {
project.sourceSets {
test {
java {
srcDir 'src/test/unit/java'
srcDir 'src/test/common/java'
}
resources {
srcDir 'src/test/unit/resources'
}
}
integrationTest {
java {
srcDir 'src/test/intg/java'
srcDir 'src/test/common/java'
}
resources {
srcDir 'src/test/intg/resources'
}
compileClasspath = project.sourceSets.main.output + project.sourceSets.test.output + project.configurations.integrationTestCompile
runtimeClasspath = output + compileClasspath + project.configurations.integrationTestRuntime
}
}
}
}
接着项目src/main/resources/META-INF/gradle-plugins目录创建文件:.properties,该文件指定Plugin实现类:
Java代码
implementation-class=com.xianlinbox.plugins.ProjectStructurePlugin
项目使用该Plugin
首先需要build.gradle脚本引入该Pluginjar包依赖文件形式更推荐jar包发布Maven库Maven依赖形式注入本例使用本文件依赖:
Groovy代码
buildscript {
dependencies {
classpath fileTree(dir: 'libs', include: '*.jar')
}
}
注入编写插件注意该插件必须java plugin起使用其使用SourceSets属性该插件引入进:
Groovy代码
apply plugin: 'java'
apply plugin: 'project-structure'
插件通‘gradle test’‘gradle integrationtTest’区别运行UnitTestIntrgrationTest
解决自设置Test Source Root问题需要build.gradleideaMole Task增加识别Test Source Root能力即:
Groovy代码
apply plugin: 'idea'
...
idea {
mole {
testSourceDirs += file('src/test/intg/java')
testSourceDirs += file('src/test/intg/resources')
}
}
我写Plugin设置Project-Structrue:
Groovy代码
......
compileClasspath = project.sourceSets.main.output + project.sourceSets.test.output + project.configurations.integrationTestCompile
runtimeClasspath = output + compileClasspath + project.configurations.integrationTestRuntime
project.idea {
mole {
testSourceDirs = testSourceDirs + new File('src/test/intg/java') + new File('src/test/intg/resources')
}
}
1、安装
Gradle安装Maven便需要载( )==》解压==》配置环境变量(GRADLE_HOME & PATH)配置环境变量记使用 source命令使新环境变量效配置功命令行通 gradle -v"验证否安装功
2、Gradle编译Maven风格java项目
首先项目根目录创建"build.gradle"文件编译java项目需要使用gradlejava插件
Groovy代码
apply plugin: 'java'
,要集maven功能需要添加maven插件
Groovy代码
apply plugin: 'maven'[
接着配置项目Repository风格
Groovy代码
repositories{
mavenCentral();
}
面例使用默认maven央库想用自本库通式配置
Groovy代码
def localMavenRepo = 'file://' + new File(System.getProperty('user.home'), '.m2/repository').absolutePath
repositories {
// Use local Maven repo location. We don't need this if we only want to install
// an artifact, but we do need it if we want to use dependencies from the local
// repository.
mavenRepo urls: localMavenRepo
mavenCentral()
}
再配置项目依赖第三库配置模板:
Groovy代码
dependencies{
compile group: '',name:'',version:''
}
举例假设项目依赖4.10版本junit配置
Groovy代码
compile group: 'junit',name:'junit',version:'4.10'
另外Depencies按式简写
Groovy代码
compile '::'
例
Groovy代码
compile 'junit:junit:4.10'
何自项目发布Repository
Groovy代码
uploadArchives {
repositories {
mavenDeployer {
repository(url: "file://localhost/tmp/myRepo/")
}
}