Gradle将lib类从lib替换为自己的类以避免重复

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命令,但似乎都没有工作(我可能做错了).我还尝试从这篇文章 "编译"下的"排除模块/组"指令.

运行/调试确认的非默认设置:

  • Type = Android测试
  • Module = 我的模块
  • 测试:全包装
  • 包装:"测试"

我的所有JUnit测试用例都在"测试"包中.

任何能让它发挥作用的答案都可以.如果不是Gradle,可能是android清单或本地源文件本身.

[编辑2016-07-24] 当我的android模拟器运行较低的API时,错误也发生在正常编译上.API 16和19错误输出,但API 23没有.

k3b*_*k3b 7

问题:链接您的应用时,链接器会找到两个版本

  • org.luaj:luaj-jse:3.0.1:org.luaj.vm2.lib.jse.JavaMethod and
  • {localProject}:org.luaj.vm2.lib.jse.JavaMethod

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许可文件和"复制".

如果这种"排除"不起作用,你可以

  • 将lib org.luaj:luaj-jse:3.0.1下载到本地libs文件夹,
  • 用zip-app打开jar/aar并手动删除重复的类.
  • 从依赖项中删除org.luaj:luaj-jse:3.0.1,因为现在从lib文件夹加载了它


Dak*_*san 2

这是我在法比奥的建议后最终添加的内容:

//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 次

最近记录:

9 年,7 月 前