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/")
}
}