当前位置: 首页 > 知识库问答 >
问题:

使用Gradle goodness以某种方式提取并重建依赖项JAR?

翁昊乾
2023-03-14

这是从这个问题开始的:Gradle,Tika-排除一些使“胖罐子”太胖的依赖包

我在这里选择的答案确实告诉您如何通过规定要排除哪些依赖项来减少“胖jar”(即一个包含其所有依赖项的可执行jar)的大小。

使用该技术,我将jar从62 MB减少到26 MB。但是提取jar并检查组成目录的卷(使用一个叫做TreeSize的漂亮应用程序),我发现我的类只占228 KB。剩下的就是依赖关系。

诚然,我的项目(或它的依赖项)确实使用了一些强大的技术:特别是Lucene(10 MB)、Apache POI(10.5 MB)、openxmlformats(10 MB)等(当然是预压缩的大小)。

问题是,我确信在任何时候,这些独立的JAR中包含的实际包和类中只有一小部分被实际使用。

考虑到一个独立的“胖罐子”并不是为了多功能性而设计的,所以不需要塞满它不使用的东西,考虑到Gradle非常聪明并且被设计来完成自动化构建的繁重工作,难道不/不应该有某种方法来提取和打包那些实际需要的类:特别是通过爆炸打包罐子,然后只重新打包所需要的类吗?

26 MB对于一个大罐子来说并不算大。但是单个项目使用的“技术”越多,只使用排除依赖项JAR的粗粒度技术就会变得越大。

我知道这将是一个远远不是微不足道的任务!

共有1个答案

孙宏壮
2023-03-14

您可以使用以下方法严格指定您希望在jar中看到/看不到的内容,同时仍然可以运行jar

apply plugin: 'java'

sourceCompatibility = 1.8
targetCompatibility = 1.8

dependecies {
your dependencies
}   

jar {
    archiveName = 'Name.jar'

    manifest {
        attributes 'Main-Class': 'uk.co.cdl.Main',
                'Class-Path': configurations.runtime.files.collect { "lib/$it.name" }.join(' '),
                'Implementation-Version': project.version
    }

    from(configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }) {
        exclude 'what you want to get rid dependencies/directories/files' etc
    }
}

使用此解决方案,通过扩展jar任务,您的gradle构建将生成可运行的jar,其中包含运行所需的编译配置中的库。

ps.如果从依赖项获取传递依赖项的负载,请尝试使用

compile (artifactGrp:artifactId:version) {transitive=false}
 类似资料:
  • 有没有人在“ng serve”中面临低于警告的情况? 警告。/node_modules/@角/编译器/src/util.js10:24-31关键依赖:要求函数的使用方式是不能静态提取依赖ℹwdm:用警告编译。 Angular版本控制: 角CLI: 6.0.8节点: 8.11.3操作系统: darwin x64角: 6.0.9......动画,常见,编译器,编译器cli,核心,形式......超文本

  • 问题内容: 如何以编程方式在Maven执行环境之外获取Maven模块的所有依赖关系? 到目前为止,我有: 通过maven-core: 并通过jcabi-aether: 到目前为止,这通常正确吗? 现在的问题是,我得到了NullPointerException: 因为mavenProject.getRemoteProjectRepositories()返回null。 如何在考虑settings.xm

  • 我有一个库,我称之为,它是另一个项目的依赖项,名为。在的构建中。gradle,我正在使用,它以如下方式指定为依赖项: 这很有效-已编译。但是,当我在我的项目中使用它时,我得到了以下内容: <code>生成。的gradle如下所示: 可能这是因为库在,但它没有正确的位置来搜索Maven存储库。有没有一种方法可以使这些搜索位置以及依赖关系本身变得短暂?

  • 在IntelliJ中的新Maven项目中,我看到了2种声明新依赖项的方法: 手动编辑pom.xml文件,添加

  • 我正在使用Gradle构建并打包一个非常简单的Spring启动应用程序(99%的静态内容)到带有嵌入式tomcat的jar中。 我尝试创建该jar,起初结果86k,没有启动,因为它缺少一些Spring Boot类。我得出结论,我制作的这个jar不包含应用程序的任何依赖项,既然我确实想要一个完全独立的jar,我应该做更多的研究。 这时,我发现建议将{configurations.compile.co

  • 问题内容: 我正在通过puppeteer将文件下载到我的目录中。我需要将此文件上传到s3存储桶,因此我需要选择文件名。但是问题是,此文件名的时间戳每次都会更改,因此我无法保留硬编码名称。那么有没有办法解决这个问题,以便每次都获得一个常量名称(即使替换了旧文件),或者如何重命名正在下载的文件? 我想到了使用节点的fs.rename()函数,但这又需要当前的文件名。 我想要一个恒定的文件名来进行硬编码