Dak*_*san 7 java android overwrite package gradle
在Android Studio中,有一个特定的文件(src/org/luaj/vm2/lib/jse/JavaMethod.java)需要从通过Gradle(dependencies {compile 'org.luaj:luaj-jse:3.0.1'})引入的包中覆盖.
我将文件复制到我的源目录中,路径完全相同,并对其进行了更改.这对于正在使用它的单个JUnit测试用例来说效果很好.它看起来似乎正在为我的项目的正常编译工作(目前无法轻易确认).
但是,当我尝试通过ProjectType ="Android Tests"的配置立即运行我的所有测试时,我得到了Error:Error converting bytecode to dex:
Cause: com.android.dex.DexException: Multiple dex files define Lorg/luaj/vm2/lib/jse/JavaMethod$Overload;.
是否需要添加到Gradle文件中的特定任务或命令,以确保项目选择本地源目录中的文件?我尝试了复制任务和sourceSets->main->java->exclude命令,但似乎都没有工作(我可能做错了).我还尝试从这篇文章 "编译"下的"排除模块/组"指令.
运行/调试确认的非默认设置:
我的所有JUnit测试用例都在"测试"包中.
任何能让它发挥作用的答案都可以.如果不是Gradle,可能是android清单或本地源文件本身.
[编辑2016-07-24] 当我的android模拟器运行较低的API时,错误也发生在正常编译上.API 16和19错误输出,但API 23没有.
问题:链接您的应用时,链接器会找到两个版本
howto fix:告诉gradle 排除 org.luaj:luaj-jse:3.0.1:org.luaj.vm2.lib.jse.JavaMethod from building
android {
packagingOptions {
exclude '**/JavaMethod.class'
}
}
Run Code Online (Sandbox Code Playgroud)
我没有尝试使用"排除类",但它适用于删除重复的gpl许可文件和"复制".
如果这种"排除"不起作用,你可以
这是我在法比奥的建议后最终添加的内容:
//Get LUAJ
buildscript { dependencies { classpath 'de.undercouch:gradle-download-task:3.1.1' }}
apply plugin: 'de.undercouch.download'
task GetLuaJ {
//Configure
def JARDownloadURL='http://central.maven.org/maven2/org/luaj/luaj-jse/3.0.1/luaj-jse-3.0.1.jar' //compile 'org.luaj:luaj-jse:3.0.1'
def BaseDir="$projectDir/luaj"
def ExtractToDir='class'
def ConfirmAlreadyDownloadedFile="$BaseDir/$ExtractToDir/lua.class"
def JarFileName=JARDownloadURL.substring(JARDownloadURL.lastIndexOf('/')+1)
def ClassesToDeleteDir="$BaseDir/$ExtractToDir/org/luaj/vm2/lib/jse"
def ClassNamesToDelete=["JavaMethod", "LuajavaLib"]
//Only run if LuaJ does not already exist
if (!file(ConfirmAlreadyDownloadedFile).exists()) {
//Download and extract the source files to /luaj
println 'Setting up LuaJ' //TODO: For some reason, print statements are not working when the "copy" directive is included below
mkdir BaseDir
download {
src JARDownloadURL
dest BaseDir
}
copy {
from(zipTree("$BaseDir/$JarFileName"))
into("$BaseDir/$ExtractToDir")
}
//Remove the unneeded class files
ClassNamesToDelete=ClassNamesToDelete.join("|")
file(ClassesToDeleteDir).listFiles().each {
if(it.getPath().replace('\\', '/').matches('^.*?/(?:'+ClassNamesToDelete+')[^/]*\\.class$')) {
println "Deleting: $it"
it.delete()
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
稍后我将上传一个可直接与该 jar 一起使用的版本。
| 归档时间: |
|
| 查看次数: |
12360 次 |
| 最近记录: |