Gradle创建多项目Jar

2024-05-13

因此,从 Gradle 和 Android Studio 诞生之初起,我就一直在使用它们。然而,我发现自己用头撞墙的次数有时远远超过了它的价值:(。

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

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

当我们的项目完成并准备就绪后,我们被要求为当前项目基础设施创建一个 SDK 供外部使用。现在,在旧的 IntelliJ 中,我只需生成一些 JavaDoc 并创建一个包含所有依赖项的 Artifact,然后创建另一个不包含依赖项 jar 的 Artifact,并尊重地命名它们。

然而,在 Gradle 中这似乎非常困难,甚至可能不受支持,而且我找不到其他人在经过 10 多个小时的 Google 搜索和反复试验后做到了这一点,我最终决定制作一个演示项目来准确展示我正在做什么以及我正在努力实现什么目标。

我需要做一些事情。

  1. 生成一个包含所有模块依赖代码和依赖 Jar 文件的 Jar 文件
  2. 生成一个包含所有模块依赖代码和零个依赖 Jar 文件的 Jar 文件
  3. 生成一个 AAR 文件,其中包括所有模块依赖代码和依赖 Jar 文件以及用于启动我们的 Activity 的资源(如果他们想要使用它)。
  4. 生成一个 AAR 文件,其中包括所有模块依赖项代码和零 Jar 文件以及用于启动我们的 Activity 的资源(如果他们想要使用它)。

所以这就是我的问题。每个模块在使用(类型: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
}

目前还没有什么能完全完成这项工作。任何帮助将不胜感激!! 预先感谢您花时间查看此内容。 如果有人想要的话,我有完整功能的示例项目,但我没有看到在这里上传的选项,所以是我构建的演示项目的链接。它很小而且很容易跟随。基本上每个项目一个类或方法。

演示项目 https://www.dropbox.com/s/f06njpjzzm3den0/HELP.zip


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

您可能想要更新清单以包含所有必需的库,如下所示(我的库中有其他内容)。

EDIT我删除了对“项目”的引用,因为在这种情况下不需要它。

 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 内容添加一些额外的代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Gradle创建多项目Jar 的相关文章

随机推荐

  • App.Config 和 Web.Config 之间的区别?

    当在 wpf 中构建桌面应用程序时 您可以阅读问题文档并在人们的答案引用 web config 时安全地替换 app config 吗 如果是这样 您是否需要注意任何明显的陷阱 tnx 阅读文档 http msdn microsoft co
  • 使用 FFT 执行音频分析

    我已经被这个问题困扰好几天了 并且浏览了几乎所有相关的 StackOverflow 页面 通过这次活动 我现在对 FFT 是什么及其工作原理有了更深入的了解 尽管如此 我在将其实现到我的应用程序中时遇到了极大的困难 简而言之 我想做的是为我
  • 为什么我必须在每次 R 升级时手动创建目录“~/R/%p-library/%v”?

    每次R升级后 我必须重新安装我使用的软件包 来自源代码 因此必须为新版本重新编译它们 这是一个正确的 可以理解的行为 所以我调用install packages http stat ethz ch R manual R devel libr
  • PHP 对象创建和内存使用

    一个基本的虚拟类 class foo var bar 0 function foo function boo echo memory get usage echo n foo new foo echo memory get usage ec
  • 字符串化 JavaScript 对象

    我正在寻找字符串化一个对象 我想要这样的输出 1 valeur dalebrun usager experttasp date 2013 08 20 16 41 50 2 valeur test usager experttasp date
  • Tornado:DummyFuture 不支持结果阻塞

    我试图获得一个非常简单的初始服务器 它可以 异步 获取 url 来工作 但它会抛出 Exception DummyFuture does not support blocking for results 有这个SO https stacko
  • 无法使用 ASP.NET Core 从 JWT 令牌获取声明

    我正在尝试使用 ASP NET Core 实现 JWT 持有者身份验证的非常简单的实现 我从控制器返回的响应有点像这样 var identity new ClaimsIdentity identity AddClaim new Claim
  • 如何从模型调用辅助方法?

    我使用 MongoDB 作为我的 Rails 应用程序中的数据库和 MongoID gem 我想从模型中调用辅助方法after create回调方法 这怎么可能 我的模型代码是 class Department include Applic
  • 使用 iOS swift AVPlayer 在横向模式下不全屏

    我将视频视图设置为全屏 然而 在模拟器中玩时 它并没有全屏运行 此问题仅适用于 iPad 不适用于 iPhone 这是我的代码 override func viewDidAppear animated Bool super viewDidA
  • iOS 视频压缩 Swift iOS 8 损坏的视频文件

    我正在尝试压缩用户相机从 UIImagePickerController 拍摄的视频 不是现有视频 而是动态视频 以上传到我的服务器 并花费少量时间来完成此操作 因此较小的尺寸是理想的选择 而不是 30 较新质量的相机为 45 mb 这是在
  • 仅获取图像中的外部轮廓

    我有这段代码 可以在图像中绘制轮廓 但我只需要外部轮廓 import cv2 import numpy as np camino C Users Usuario Documents Deteccion de Objetos 123 jpg
  • Laravel:如何设置多对多关系的连接?

    我有模型 class User extends Model protected connection mysql public function areas return this gt belongsToMany Area class u
  • JQuery 验证不起作用

    我有一种表单 其中一个输入类型的值为 名字 但这可以在 onfocus 函数上更改我想验证此输入字段 如果它为空白或 名字 我有两个 jQuery 文件jquery 1 4 2 min js jquery validate pack js
  • 如何在 Web 应用程序中使用 Javascript 安全地访问 Windows Azure 移动服务?

    我需要一本 web javascript 安全入门书 根据如何使用 Windows Azure 移动服务的 HTML JavaScript 客户端 http www windowsazure com en us develop mobile
  • jqPlot DateAxis tickInterval 不起作用

    我试图每月绘制一个包含单个数据点的图表 我会在每个月的第一天将其作为一个点发送到 jqPlot jqplot actualChart 2011 10 01 0 296 2011 11 01 0 682 title programSelect
  • Nuxt + Vuex - 如何将 Vuex 模块分解为单独的文件?

    在 Nuxt 文档中 here https nuxtjs org guide vuex store module files 它说 您可以选择将模块文件分解为单独的文件 state js actions js mutations js an
  • Chrome:window.print() 打印对话框仅在页面重新加载后打开 (javascript)

    我面临着一个非常奇怪的问题 我正在从 javascript 文件调用 window print 这在 Safari IE Firefox 中运行良好 直到两小时前 它在 Chrome 中也运行良好 版本29 0 1547 57 我没有更改我
  • Jmeter - http 采样器第一次迭代所花费的时间很长

    我是 Jmeter 的新手 我已经编写了一个 http 采样器 我正在运行 5 次迭代 这是我得到的读数 805 160 148 185 143 我注意到第一次迭代所花费的时间比前四次要长 每次运行采样器时我都会观察到同样的情况 仅供参考
  • 在 Android 运行时更改和应用主题 [重复]

    这个问题在这里已经有答案了 可能的重复 如何在 Android 运行时更改当前主题 https stackoverflow com questions 2482848 how to change current theme at runti
  • Gradle创建多项目Jar

    因此 从 Gradle 和 Android Studio 诞生之初起 我就一直在使用它们 然而 我发现自己用头撞墙的次数有时远远超过了它的价值 我花了一天半的时间试图解决我目前的困境 在我工作的地方 我们使用很多共享库项目 这意味着与 Gr