一、最簡單的打包方式
在講生成包含第三方庫之前,先講個(gè)最簡單的生成jar包方式:
task copyJar(type: Copy) {
delete 'build/libs/code.jar' //刪除之前的舊jar包
archivesBaseName = "code"http://jar包名稱
from('build/classes/java/main') //這里是代碼編譯后的jar包目錄
into('build/libs') //jar包輸出目錄
include('classes.jar')//復(fù)制的代碼jar包,固定叫classes.jar
rename('classes.jar', 'aaa.jar') //重命名jar包的名字(隨便寫都可以)
}
copyJar.dependsOn(build)
上面這種方式可以將代碼打進(jìn)jar包,但jar包里不包含資源文件和第三方庫的jar包源碼。
注意: from('build/classes/java/main')是能找到你代碼的編譯后的源碼路徑,我的Studio版本原由,必須寫這個(gè)目錄,一般網(wǎng)上大家的路徑是from('build/intermediates/bundles/release),不管是哪個(gè)路徑,只要能找到你的代碼就行。
將上面的代碼放入build.gradle文件里,同步(Sync)一下代碼,在AndroidStudio的右側(cè)有個(gè)Gradle

點(diǎn)開之后找到你項(xiàng)目的Tasks,再找到對(duì)應(yīng)到剛剛的方法,雙擊運(yùn)行。

運(yùn)行成功后會(huì)在你指定的目錄下生成對(duì)應(yīng)的jar包。這里指定的是build/libs

二、包含第三方庫的打包方式
這個(gè)我用上面那種方法試過很多次,最終發(fā)現(xiàn)無論如何都打不進(jìn)第三方庫的代碼。最終我找到了另一種方式:
task makeJar(type: Jar) {
delete 'build/mylib.jar'//刪除舊的jar
destinationDir = file('build/libs')//指定新jar包存放目錄
archivesBaseName = "mylib"http://指定新jar包名字
from file('build/classes/java/main')//你寫的代碼的來源,編譯后能找到你代碼的路徑。因人而異,有可能是 from('build/intermediates/bundles/release/classes.jar')
//第三方庫的jar包存放位置
from(project.zipTree("libs/fastjson-1.2.55.jar"))
from(project.zipTree("libs/okhttp-3.10.0.jar"))
from(project.zipTree("libs/okio-2.2.1.jar"))
from(project.zipTree("libs/kotlin-stdlib-1.3.11.jar"))
}
makeJar.dependsOn(build)
打包過程同上。
以這種形式打出的jar包就包含第三方庫的代碼。
如何判斷是否包含第三方庫的代碼?
把生成的jar包重命名為.zip格式,解壓之后可以看到代碼目錄,如果含有第三方庫代碼,就說名打包成功了。
遇到的問題
1、運(yùn)行jar包時(shí)報(bào)jar中沒有主清單屬性
解決辦法:在gradle文件里添加寫入清單文件的指定主函數(shù)入口。
jar {
manifest {
attributes 'Main-Class': 'com.autotestdemo.maomao.reptilelib.MyClass'
}
}
但是,這個(gè)命令并不能如愿寫入清單文件。我的結(jié)論是:以
(type: Copy)的形式打出的jar包,上面的命令可以生效。但以(type: Jar)的形式生成的jar包,上面的命令行無法寫入清單文件?;蛟S這是Studio的一個(gè)bug。
2、基于上面這個(gè)問題,即使你手動(dòng)改寫MANIFEST.MF文件內(nèi)容,用java -jar命令運(yùn)行的時(shí)候還會(huì)報(bào)另外一個(gè)錯(cuò):
maomaodeMacBook-Pro:PAMobileWallet maomao$ java -jar reptilelib/build/libs/mylib.jar
Error: Invalid or corrupt jarfile /Users/maomao/Documents/demo/AutoTestDemo/reptilelib/build/libs/mylib.jar
這個(gè)問題我還沒找到解決辦法,鉆了2天也沒找到原因,最后我決定放棄,改用Eclipse打一個(gè)可以運(yùn)行的jar包。
當(dāng)然,如果你的jar無需運(yùn)行,只是作為一個(gè)依賴,用上面這兩種方式是完全足夠的。
Eclipse打包請(qǐng)參見:《「Eclipse」生成能用命令行運(yùn)行的jar包》