如何使用gradle从3个子模块构建1个jar

问题描述 投票:4回答:2

我有:

  • Android Studio 3
  • gradle 4.1
  • gradle tools 3:classpath 'com.android.tools.build:gradle:3.0.1'

当我有一个模块并使用gradle工具2时,我使用了:

task makeJar(type: Copy) {
    def releaseFolder = new File('build/intermediates/bundles/release/')
    if (releaseFolder.exists()) {
        from('build/intermediates/bundles/release/')
    } else {
        from('build/intermediates/bundles/default/')
    }
    into('build/outputs/jar/')
    include('classes.jar')
    rename ('classes.jar', 'MY-Android-SDK.jar')
}

现在有3个模块:

              MainModule (com.my)
                 /   \
(com.my.m1) Module1   Module2 (com.my.m2)

我想从所有3个模块创建MY-Android-SDK.jar文件。

到目前为止,我将能够为每个模块创建3个jar文件,并以某种方式合并它们,但我认为它不是正确的方法。

有任何想法吗?

android gradle
2个回答
3
投票

首先,如果您要创建Android库,请创建AAR,而不是JAR。 AAR文件遵循android SDK结构并且可以具有清单文件,因此需要权限和xml资源等。

其次,如果您要从几个不同的模块创建框架(事实上这是一种非常合理的方法!),您应该创建不同的工件(AAR / JAR文件)。这样可以更容易处理传递依赖,SDK级别冲突,只消耗你需要的东西(有些情况下你不需要一半的SDK,在这种情况下丢弃gradle文件中的一些条目比摆弄它更容易proguard删除所有未使用的类),提供替代实现或可插拔系统(例如,您创建一个合同模块,比如DFP,以及双击模块。然后,通过Inversion of Control,您使用double填写合同点击,下个月,他们会要求您用亚马逊广告替换双击。您可以在合同模块后创建一个包含亚马逊广告的模块,并替换亚马逊注入的双击参考。)

无论如何,请记住传递性。根据您带来依赖项的方式,可以使用build.gradle文件中的单个依赖项将所有内容添加到路径中。如果您使用'api':

api 'com.myname:moduleX:xxx'

在模块com.myname:moduleY中,moduleX也将在路径中。首先使用Gradle maven plugin创建工件。这将允许您使用“安装”任务创建一个Android AAR文件,并将其部署到您的本地maven仓库(gradle中的mavenLocal())。如果使用“api”包含所有子模块,它们将被添加到路径中。我不建议这样做,而是只导入每个模块中的必要内容,并为每个模块创建单独的AAR文件,并在您的应用程序中使用它们。

现在,如果出于某种原因,你需要创建一个胖/优步JAR,那么这个过程称为“着色”。所以,你需要一个用于gradle的阴影插件。幸运的是,有一个few。只需选择最适合您的情况(或使用maven和maven shade插件)。无论如何,作为具有开发库和框架经验的人,请尽可能保持模块的原子性和独立性。最后,如果你需要一个gradle maven插件的工作示例,请尝试this,它已经过时了,但是作为一个例子。祝好运!


1
投票

在你的settings.gradle中添加其他两个模块的依赖关系

settings.gradle

rootProject.name = 'MainModule'
include 'module2'
include 'module3'

在你的build.gradle属于MainModule添加此代码:

的build.gradle

configurations {
    modules
    compile.extendsFrom(modules)
}

dependencies{
    modules project(':moudle2')
    modules project(':moudle3')
}

task packageAll(type: Jar) {
    manifest {
        attributes 'Main-Class': 'YourMainClass'
    }

    // pack yours main module
    from sourceSets.main.output

    // pack your other two modules
    from {
        configurations.modules.collect { it.isDirectory() ? it : zipTree(it) }
    }

    // pack all dependencies in the project
    from configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }

    version = ""
    baseName = "MY-Android-SDK"
}
© www.soinside.com 2019 - 2024. All rights reserved.