有两种方法可以做到这一点,两种方法都涉及关闭压缩。首先使用Gradle,然后使用jar方法关闭它...
您可以使用Gradle来完成此操作(实际上该答案来自OP)
shadowJar {
zip64 true
entryCompression = org.gradle.api.tasks.bundling.ZipEntryCompression.STORED
exclude 'META-INF/*.RSA', 'META-INF/*.SF','META-INF/*.DSA'
manifest {
attributes 'Main-Class': 'com.my.project.Main'
}
}
使用
jar {
manifest {
attributes(
'Main-Class': 'com.my.project.Main',
)
}
}
task fatJar(type: Jar) {
manifest.from jar.manifest
classifier = 'all'
from {
configurations.runtime.collect { it.isDirectory() ? it : zipTree(it) }
} {
exclude "META-INF/*.SF"
exclude "META-INF/*.DSA"
exclude "META-INF/*.RSA"
}
with jar
}
关键在于压缩已被关闭,即:
org.gradle.api.tasks.bundling.ZipEntryCompression.STORED
您可以在这里找到文档:
https://docs.gradle.org/current/javadoc/org/gradle/api/tasks/bundling/ZipEntryCompression.html#STORED
是的,您可以通过不压缩JAR文件,利用rsync的分块算法,从而在新存档中将速度提高约40%,在已经同步过的JAR存档上将速度提高超过200%。
我使用了以下命令来压缩一个包含大量class文件的目录...
jar cf0 uncompressed.jar .
jar cf compressed.jar .
这创建了以下两个 JAR 包...
-rw-r--r-- 1 rsync jar 28331212 Apr 13 14:11 ./compressed.jar
-rw-r--r-- 1 rsync jar 38746054 Apr 13 14:10 ./uncompressed.jar
请注意,未压缩的Jar大小约大10MB。
然后我使用以下命令对这些文件进行了rsync并计时。(注意,即使为压缩文件启用压缩也几乎没有影响,稍后我会解释)
压缩的Jar
time rsync -av -e ssh compressed.jar jar@rsync-server.org:/tmp/
building file list ... done
compressed.jar
sent 28334806 bytes received 42 bytes 2982615.58 bytes/sec
total size is 28331212 speedup is 1.00
real 0m9.208s
user 0m0.248s
sys 0m0.483s
未压缩的Jar包
time rsync -avz -e ssh uncompressed.jar jar@rsync-server.org:/tmp/
building file list ... done
uncompressed.jar
sent 11751973 bytes received 42 bytes 2136730.00 bytes/sec
total size is 38746054 speedup is 3.30
real 0m5.145s
user 0m1.444s
sys 0m0.219s
我们已经实现了近50%的加速。这至少可以加快rsync并且我们获得了很好的提升,但是如果进行了小的更改会如何呢?
我从目录中删除了一个大小为170字节的类文件,并重新创建了jar文件,现在它们的大小是这样的...
-rw-r--r-- 1 rsycn jar 28330943 Apr 13 14:30 compressed.jar
-rw-r--r-- 1 rsync jar 38745784 Apr 13 14:30 uncompressed.jar
现在的时间安排非常不同。
压缩的Jar文件
building file list ... done
compressed.jar
sent 12166657 bytes received 31998 bytes 2217937.27 bytes/sec
total size is 28330943 speedup is 2.32
real 0m5.435s
user 0m0.378s
sys 0m0.335s
未压缩的Jar包
building file list ... done
uncompressed.jar
sent 220163 bytes received 43624 bytes 175858.00 bytes/sec
total size is 38745784 speedup is 146.88
real 0m1.533s
user 0m0.363s
sys 0m0.047s
因为信息理论的原因,我们可以使用这种方法加速大型jar文件的rsync。当您压缩数据时,它实际上会将数据中的所有常见部分删除,也就是说,剩下的内容看起来非常像随机数据,最好的压缩程序会删除更多的此类信息。对数据进行微小更改,大多数压缩算法都会对数据输出产生巨大影响。
Zip算法有效地使rsync在服务器和客户端之间查找相同校验和变得更加困难,这意味着它需要传输更多的数据。当您解压缩时,您让rsync做它擅长的事情,发送较少的数据来同步两个文件。