首页 文章

Gradle创建多项目Jar

提问于
浏览
1

因此,自从他们成立初期以来,我一直在Gradle和Android Studio中玩游戏 . 然而,我发现自己在墙壁上撞击的次数远远超过了它的次数值得:( .

我花了一天半时间试图解决目前的困境 .

在我工作的地方,我们使用了很多共享的库项目 . 这意味着,与Gradle的原生假设不同,我的项目并非全部嵌套在一个父项目下 . (但这不是我的问题)我已经得到了这个工作 .

在我们的项目完成并准备好之后,它被要求为当前项目基础架构创建一个SDK以供外部使用 . 现在在旧的IntelliJ中我只生成一些JavaDocs并创建一个包含所有依赖项的Artifact,然后另一个不包含依赖项jars并尊重它们 .

然而,在Gradle中,这看起来非常困难,甚至可能都不受支持,而且在经过超过10个小时的谷歌搜索和反复试验后,我找不到其他人已经完成了这项工作,我最终决定制作一个演示项目来准确显示我正在做什么以及我想要完成什么 .

我需要做一些事情 .

  • 生成包含所有模块依赖关系代码和相关Jar文件的Jar文件

  • 生成包含所有模块依赖关系代码和ZERO依赖Jar文件的Jar文件

  • 生成一个AAR文件,其中包含所有模块依赖关系代码和相关的Jar文件,以及用于启动我们的Activity的资源(如果他们想要使用它) .

  • 生成包含所有模块依赖关系代码和ZERO Jar文件的AAR文件,以及用于启动我们的活动的资源(如果他们想要使用它) .

所以我的问题就在于此 . 运行Task with(type:Jar)时,每个模块只生成它自己的代码 . 我设法让依赖的Jar文件一次编译,但是没有常规的源代码,但是我从来没有能够将模块的源代码包含在Jar文件中,这是我现在最大的障碍 .

这是我在没有完成这个简单任务的情况下尝试过的任务列表 .

evaluationDependsOn(':dependencyModule')


task myJar(type: Jar){
    appendix = 'myJar'
    from android.sourceSets.main.allSource.files
}

task uberJar (type: Jar){
    from(configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }) {
        exclude "META-INF/*.SF"
        exclude "META-INF/*.DSA"
        exclude "META-INF/*.RSA"
    }
}

task fatJar(type: Jar, dependsOn: 'compileJava') {
    from {
        sourceSets.main.output.classesDir
    }

    // Add all dependencies except for android.jar to the fat jar
    from {
        configurations.compile.findAll {
            it.getName() != 'android.jar'
        }.collect {
            it.isDirectory() ? it : zipTree(it)
        }
    }

    archiveName = 'fatJar.jar'
}

task jarFat(type: Jar) {
    appendix = "fat"
    from android.sourceSets.main.java
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
}

task sourcesJar(type: Jar) {
    from android.sourceSets.main.allSource
    classifier = 'sources'
}

task clearJar(type: Delete) {
    delete 'build/libs/myCompiledLibrary.jar'
}

task makeJar(type: Copy) {
    from('build/bundles/release/')
    into('build/libs/')
    include('classes.jar')
    rename ('classes.jar', 'myCompiledLibrary.jar')
}

makeJar.dependsOn(clearJar, build)

task jar(type: Jar) {
    from android.sourceSets.main.allJava
}

task deployJar(type: Jar, dependsOn: jar) {
    baseName = project.name + '-deploy'
    deps = configurations.runtime + configurations.archives.allArtifactFiles
    depClasses = { deps.collect { it.isDirectory() ? it : zipTree(it) } }
    from(depClasses) {
        exclude 'META-INF/MANIFEST.MF'
    }
}

task modelJar(type: Jar) {
    from sourceSets.main.output
}
task jarWithDependency(type: Jar){
    from android.sourceSets.main.classesDir
    from {configurations.compile.collect {zipTree(it)}}
}

task androidJavadocs(type: Javadoc) {
    source = android.sourceSets.main.allJava
}

还没有完成这项工作 . 任何帮助将不胜感激!!提前感谢您抽出时间来看看这个 . 我有完整功能的示例项目,如果有人想要它,但我没有看到上传选项,所以是我 Build 的演示项目的链接 . 它非常小,非常容易理解 . 基本上每个项目的一个类或方法 .

Demo Project

2 回答

  • 0

    使用 application 插件,您只需调用"distZip"即可获得包含所有库的zip . 默认情况下,您将获得一个 bin 目录,其中包含批处理文件和一个用于运行程序的shell脚本以及一个包含所有jar文件的 lib 目录 .

    您可能希望更新Manifest以包含所有必需的库,如下所示(我的其他内容) .

    EDIT 我删除了对"project"的引用,因为在这种情况下不需要它 .

    jar.doFirst
     {
         // aggregate all the jars needed at runtime into a local variable (array)
         def manifestClasspath = configurations.runtime.collect { it.name }
    
         // remove duplicate jar names, and join the array into a single string
         manifestClasspath = manifestClasspath.unique().join(" ")
    
         // set manifest attributes - mainClassName must be set before it is used here
         manifest.attributes.put("Main-Class", mainClassName)
         manifest.attributes.put("Class-Path", manifestClasspath)
     }
    

    我不是Android开发人员,因此您必须为AAR添加一些额外的代码 .

  • 0

    来自作者的更新 . 好的,随着时间的推移,我了解到最好的做法是允许依赖管理工具完成工作而不是尝试打包这些文件 .

    你可以创建fat jar和fat aar文件,有插件可以帮助,但它很hacky并且如果它们嵌套在已编译的产品中,则不允许用户正确地排除传递 . exclude用于maven服务器pom文件以包含或排除依赖项文件 .

    因此,使用Maven Repo Server是管理它的最佳方式,因为FAT编译器插件不可靠并且每个gradle更新都会中断,更重要的是限制用户在传递时排除“some and not all”的能力 .

    所以,如果你可以避免它并且以我推荐的正确方式做到这一点,请远离这样做 . 我将留下这篇文章以防万一其他人也在走这条坏路径,并希望你移动到依赖管理服务器的正确路径,由pom文件管理传递依赖 .

相关问题