我正在使用Hudson构建一个项目。我有几个jar文件,我想使用Ant SignJar任务使用时间戳签名。当没有时间戳时,它就像一个魅力 - 一个文件大约需要2-3秒。当我添加' tsaurl'属性为SignJar任务。然后时间戳为一个文件占用几分钟。我试图使用不同的时间戳服务器,它没有帮助。有人知道为什么要花这么多时间吗?首先,有什么方法可以解决这个问题吗?
答案 0 :(得分:4)
我使用jarsign花费太长时间(至少在Linux上)的主要问题是内核熵池干涸了。此时,该过程将阻塞,直到更多熵到达。这会导致您看到坐在那里的jarsigner进程没有占用CPU时间但也没有做太多的症状。
在某些时候(从1.5到1.6 AFAIK),Java从使用/dev/urandom
转到/dev/random
。真正的熵实际上是现代计算机上的稀缺资源 - 大量RAM会减少磁盘活动,缓存内容的智能程序会减少网络活动。我告诉我,在虚拟机上(就像许多构建服务器一样),熵收集率甚至可以更低。
你可以
/dev/urandom
(如果您不是偏执狂)/dev/random
我选择了选项B:我为我选择的发行版(Ubuntu)安装了randomsound
包。这样可以对你的麦克风进行采样,并在干燥时使用它将熵注入/dev/random
。这方面的主要缺点是它阻止麦克风用于其他用途。还有其他方法可以获得额外的熵,例如将磁盘复制到/dev/null
,或者执行包更新(大量磁盘和网络流量)。您可能希望使用硬件RNG将一台或多台服务器打包出去,并安装可以为其他服务器提供熵即服务的服务。或者甚至USB声卡和randomsound
都能正常工作(在服务器机房中有很多白色声音......)
对于选项A,您可以设置属性
-Djava.security.egd=file:/dev/./urandom
(请注意额外的点 - 这是为了解决一个"智能"代码假设你想要/dev/random
,即使你不这样说:见:{{3 }})