我的项目中有一个用例,我必须在准备 jar 时修改类文件内容并使用自定义类加载器来加载该类。
为了实现上述场景,我CopySpec
在我的build.gradle
. 令人惊讶的是,它适用于小类文件,而不适用于大文件。有什么我想念的吗?
def contentSpec = copySpec {
from {
configurations.runtime.collect {it.isDirectory() ? it : zipTree(it)}
}
eachFile (new Action<FileCopyDetails>() {
@Override
void execute(FileCopyDetails fileCopyDetails) {
if (fileCopyDetails.getPath().contains('abc')) {
println fileCopyDetails.getPath()
byte[] content = fileCopyDetails.file.bytes;
byte[] newContent = encryptClass.encrypt(content)
println ("${content.length} -> ${newContent.length}")
fileCopyDetails.file.bytes = newContent
println fileCopyDetails.file.bytes.length
fileCopyDetails.setName(fileCopyDetails.getName().replace(".class",".enc"))
}
}
})
with jar
}
例如,我有一个名为 AbcConfig.class 的文件,println 语句打印如下:它显示 33232 字节写入(修改后)com/abc/xyz/config/AbcConfig.class 33216 -> 33232 33232
但是当我提取 jar 并执行 ls -lrt 以检查磁盘上特定字节的数量时,它显示(输出中的 33202)
-rwxrwxrwx 1 根 33202 8 月 3 日 13:02 AbcConfig.enc