JBOSS引入外部jar包报错

来源:互联网 发布:图书馆管理系统 uc矩阵 编辑:程序博客网 时间:2024/05/16 16:16

最近在一个工程中需要实现非对称加解密功能,于是使用Java提供的类org.bouncycastle.jce.provider.BouncyCastleProvider,进一步引入jar包bcprov-jdk16-146.jar,在Mavean工程中直接加入依赖:

<dependency>    <groupId>org.bouncycastle</groupId>    <artifactId>bcprov-jdk16</artifactId>    <version>1.46</version></dependency>

部署到Jboss7.2.0中,然后启动工程,出现错误:

    2017-10-23 21:18:49,273 INFO  [stdout] (web-container-thread-1) java.lang.SecurityException: JCE cannot authenticate the provider BC    2017-10-23 21:18:49,273 INFO  [stdout] (web-container-thread-1)         at javax.crypto.Cipher.getInstance(DashoA13*..)    2017-10-23 21:18:49,273 INFO  [stdout] (web-container-thread-1)         at com.unionpay.upchat.pub.console.util.SecurityUtil.<clinit>(SecurityUtil.java:41)    2017-10-23 21:18:49,273 INFO  [stdout] (web-container-thread-1)         at com.unionpay.upchat.pub.console.restservice.UserResource.login(UserResource.java:111)    2017-10-23 21:18:49,274 INFO  [stdout] (web-container-thread-1)         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)    2017-10-23 21:18:49,274 INFO  [stdout] (web-container-thread-1)         at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)    2017-10-23 21:18:49,274 INFO  [stdout] (web-container-thread-1)         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)    2017-10-23 21:18:49,274 INFO  [stdout] (web-container-thread-1)         at java.lang.reflect.Method.invoke(Method.java:597)    2017-10-23 21:18:49,275 INFO  [stdout] (web-container-thread-1)         at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:167)    2017-10-23 21:18:49,275 INFO  [stdout] (web-container-thread-1)         at org.jboss.resteasy.core.ResourceMethod.invokeOnTarget(ResourceMethod.java:257)    2017-10-23 21:18:49,275 INFO  [stdout] (web-container-thread-1)         at org.jboss.resteasy.core.ResourceMethod.invoke(ResourceMethod.java:222)    2017-10-23 21:18:49,275 INFO  [stdout] (web-container-thread-1)         at org.jboss.resteasy.core.ResourceMethod.invoke(ResourceMethod.java:211)    2017-10-23 21:18:49,275 INFO  [stdout] (web-container-thread-1)         at org.jboss.resteasy.core.SynchronousDispatcher.getResponse(SynchronousDispatcher.java:542)    2017-10-23 21:18:49,276 INFO  [stdout] (web-container-thread-1)         at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:524)    2017-10-23 21:18:49,276 INFO  [stdout] (web-container-thread-1)         at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:126)    2017-10-23 21:18:49,276 INFO  [stdout] (web-container-thread-1)         at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:208)    2017-10-23 21:18:49,276 INFO  [stdout] (web-container-thread-1)         at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:55)    2017-10-23 21:18:49,276 INFO  [stdout] (web-container-thread-1)         at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:50)    2017-10-23 21:18:49,283 INFO  [stdout] (web-container-thread-1) Caused by: java.util.jar.JarException: Cannot parse vfs:/content/upchat-public-console-web.war/WEB-INF/lib/bcprov-jdk16-1.46.jar    2017-10-23 21:18:49,283 INFO  [stdout] (web-container-thread-1)         at javax.crypto.SunJCE_c.a(DashoA13*..)    2017-10-23 21:18:49,284 INFO  [stdout] (web-container-thread-1)         at javax.crypto.SunJCE_b.b(DashoA13*..)    2017-10-23 21:18:49,284 INFO  [stdout] (web-container-thread-1)         at javax.crypto.SunJCE_b.a(DashoA13*..)    2017-10-23 21:18:49,284 INFO  [stdout] (web-container-thread-1)         ... 46 more    2017-10-23 21:18:49,285 ERROR [stderr] (web-container-thread-1) java.lang.SecurityException: JCE cannot authenticate the provider BC    2017-10-23 21:18:49,285 ERROR [stderr] (web-container-thread-1)         at javax.crypto.Cipher.getInstance(DashoA13*..)    2017-10-23 21:18:49,286 ERROR [stderr] (web-container-thread-1)         at com.unionpay.upchat.pub.console.util.SecurityUtil.<clinit>(SecurityUtil.java:41)    2017-10-23 21:18:49,286 ERROR [stderr] (web-container-thread-1)         at com.unionpay.upchat.pub.console.restservice.UserResource.login(UserResource.java:111)    2017-10-23 21:18:49,286 ERROR [stderr] (web-container-thread-1)         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)    2017-10-23 21:18:49,286 ERROR [stderr] (web-container-thread-1)         at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)    2017-10-23 21:18:49,287 ERROR [stderr] (web-container-thread-1)         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)    2017-10-23 21:18:49,287 ERROR [stderr] (web-container-thread-1)         at java.lang.reflect.Method.invoke(Method.java:597)    2017-10-23 21:18:49,287 ERROR [stderr] (web-container-thread-1)         at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:167)    2017-10-23 21:18:49,288 ERROR [stderr] (web-container-thread-1)         at org.jboss.resteasy.core.ResourceMethod.invokeOnTarget(ResourceMethod.java:257)

按照网上提供的方法:

  • pom.xml中上述依赖包处增加:
<scope>provided</scope>
  • 在JAVA_HOME/jre/lib/security/java.security下增加

security.provider.10=org.bouncycastle.jce.provider.BouncyCastleProvider to java.security

  • 将该jar包放到JAVA_HOME/jre/lib/ext下,并将项目中的jar包去掉

发现并不能解决问题,仍然报错:

2017-10-23 18:53:51,924 INFO  [org.jboss.weld.ClassLoading] (MSC service thread 1-4) catching: org.jboss.weld.resources.spi.ResourceLoadingException: Error loading class com.unionpay.upchat.pub.console.util.SecurityUtil    Caused by: java.lang.NoClassDefFoundError: org/bouncycastle/jce/provider/BouncyCastleProvider        at java.lang.Class.getDeclaredFields0(Native Method) [rt.jar:1.6.0_45]        at java.lang.Class.privateGetDeclaredFields(Class.java:2300) [rt.jar:1.6.0_45]        at java.lang.Class.getDeclaredFields(Class.java:1745) [rt.jar:1.6.0_45]        at org.jboss.weld.util.reflection.SecureReflections$4.work(SecureReflections.java:105) [weld-core-1.1.10.Final.jar:2012-10-12 10:00]        at org.jboss.weld.util.reflection.SecureReflections$4.work(SecureReflections.java:102) [weld-core-1.1.10.Final.jar:2012-10-12 10:00]        at org.jboss.weld.util.reflection.SecureReflectionAccess.run(SecureReflectionAccess.java:52) [weld-core-1.1.10.Final.jar:2012-10-12 10:00]        at org.jboss.weld.util.reflection.SecureReflectionAccess.runAndWrap(SecureReflectionAccess.java:63) [weld-core-1.1.10.Final.jar:2012-10-12 10:00]        at org.jboss.weld.util.reflection.SecureReflections.getDeclaredFields(SecureReflections.java:102) [weld-core-1.1.10.Final.jar:2012-10-12 10:00]        at org.jboss.weld.introspector.jlr.WeldClassImpl.<init>(WeldClassImpl.java:155) [weld-core-1.1.10.Final.jar:2012-10-12 10:00]        at org.jboss.weld.introspector.jlr.WeldClassImpl.of(WeldClassImpl.java:121) [weld-core-1.1.10.Final.jar:2012-10-12 10:00]        at org.jboss.weld.resources.ClassTransformer$TransformTypeToWeldClass.apply(ClassTransformer.java:59) [weld-core-1.1.10.Final.jar:2012-10-12 10:00]        at org.jboss.weld.resources.ClassTransformer$TransformTypeToWeldClass.apply(ClassTransformer.java:50) [weld-core-1.1.10.Final.jar:2012-10-12 10:00]        at com.google.common.collect.ComputingConcurrentHashMap$ComputingValueReference.compute(ComputingConcurrentHashMap.java:358) [guava-18.0.jar:]        at com.google.common.collect.ComputingConcurrentHashMap$ComputingSegment.compute(ComputingConcurrentHashMap.java:184) [guava-18.0.jar:]        at com.google.common.collect.ComputingConcurrentHashMap$ComputingSegment.getOrCompute(ComputingConcurrentHashMap.java:153) [guava-18.0.jar:]        at com.google.common.collect.ComputingConcurrentHashMap.getOrCompute(ComputingConcurrentHashMap.java:69) [guava-18.0.jar:]        at com.google.common.collect.ComputingConcurrentHashMap$ComputingMapAdapter.get(ComputingConcurrentHashMap.java:396)        at org.jboss.weld.resources.ClassTransformer.loadClass(ClassTransformer.java:163) [weld-core-1.1.10.Final.jar:2012-10-12 10:00]        ... 11 more    Caused by: java.lang.ClassNotFoundException: org.bouncycastle.jce.provider.BouncyCastleProvider from [Module "deployment.upchat-public-console-web.war:main" from Service Module Loader]        at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:196) [jboss-modules.jar:1.2.2.Final]        at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:444) [jboss-modules.jar:1.2.2.Final]        at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:432) [jboss-modules.jar:1.2.2.Final]        at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:399) [jboss-modules.jar:1.2.2.Final]        at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:374) [jboss-modules.jar:1.2.2.Final]        at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:119) [jboss-modules.jar:1.2.2.Final]

经过一番研究,可以按照如下步骤解决上述存在的问题:

  • (1)project的pom.xml增加:

    <dependency>    <groupId>org.bouncycastle</groupId>    <artifactId>bcprov-jdk16</artifactId>    <version>1.46</version>    <scope>provided</scope></dependency>
  • (2)在$JBOSS_HOME/modules/system/layers/base/org/bouncycastle/main下,添加bcprov-jdk16-146.jar、module.xml

其中module.xml内容如下:

<module xmlns="urn:jboss:module:1.1" name="org.bouncycastle">    <resources>        <resource-root path="bcprov-jdk16-1.46.jar"/>    </resources>    <dependencies>        <module name="javax.api" slot="main" export="true"/>    </dependencies></module>
  • (3)在$JBOSS_HOME/standalone/configuration/standalone.xml中找到处添加如下:
    <global-modules>        <module name="org.bouncycastle" slot="main"/>    </global-modules>