我们有一个scala应用程序,它是由命令sbt dist
构建的,它使用本机打包程序创建一个zip文件,并将SBT导入的所有jar文件转储到zip文件中。
这对我们有用但是经过一些我们意识到一些jar文件具有相同的类文件(但是版本不同),并且我们得到关于丢失方法等的运行时错误。
所以我们使用sbt assembly
并定义了一个合并策略来构建一个具有正确类文件的胖jar。
然而现在在构建胖罐之后我得到了JCE错误
Caused by: java.lang.SecurityException: JCE cannot authenticate the provider BC
at javax.crypto.Cipher.getInstance(Cipher.java:657)
at javax.crypto.Cipher.getInstance(Cipher.java:596)
at org.bouncycastle.jcajce.util.NamedJcaJceHelper.createCipher(Unknown Source)
at org.bouncycastle.openpgp.operator.jcajce.OperatorHelper.createCipher(Unknown Source)
at org.bouncycastle.openpgp.operator.jcajce.JcePBESecretKeyDecryptorBuilder$1.recoverKeyData(Unknown Source)
... 24 more
Caused by: java.util.jar.JarException: file:/fat.jar has unsigned entries - -base__DDLMigration.sql
at javax.crypto.JarVerifier.verifySingleJar(JarVerifier.java:464)
at javax.crypto.JarVerifier.verifyJars(JarVerifier.java:322)
at javax.crypto.JarVerifier.verify(JarVerifier.java:250)
at javax.crypto.JceSecurity.verifyProviderJar(JceSecurity.java:160)
at javax.crypto.JceSecurity.getVerificationResult(JceSecurity.java:186)
at javax.crypto.Cipher.getInstance(Cipher.java:653)
所以似乎jar文件已签名,当我们将各个jar文件转储到zip文件中时,一切正常。现在,当我们将单个类移动到胖罐中时,签名就会丢失。
因此,对于已签名的jar文件中的每个类,现在被移动到胖罐,我们会收到错误,因为胖罐丢失了原始jar的签名信息。