Исполняемый файл JAR: JMSCC0091: не удалось загрузить фабрику поставщика для типа подключения com.ibm.msg.client.wmq
Я столкнулся с этой очень странной проблемой, работая над использованием JMSTemplate для соединения с IBM Websphere MQ. Код отлично работает в Eclipse, но когда я использую плагин shade для упаковки проекта и всех зависимостей в Uber jar, я получаю эту ошибку при выполнении файла jar:
com.ibm.msg.client.jms.DetailedJMSException: JMSCC0091: The provider factory for connection type 'com.ibm.msg.client.wmq' could not be loaded.
at sun.reflect.GeneratedConstructorAccessor4.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:57)
at java.lang.reflect.Constructor.newInstance(Constructor.java:437)
at com.ibm.msg.client.commonservices.j2se.NLSServices.createException(NLSServices.java:319)
at com.ibm.msg.client.commonservices.nls.NLSServices.createException(NLSServices.java:233)
at com.ibm.msg.client.jms.internal.JmsErrorUtils.createException(JmsErrorUtils.java:109)
at com.ibm.msg.client.jms.internal.JmsFactoryFactoryImpl.getInstance(JmsFactoryFactoryImpl.java:172)
at com.ibm.msg.client.jms.admin.JmsConnectionFactoryImpl.setProviderFactory(JmsConnectionFactoryImpl.java:167)
at com.ibm.msg.client.jms.admin.JmsConnectionFactoryImpl.createConnection(JmsConnectionFactoryImpl.java:254)
at com.ibm.mq.jms.MQConnectionFactory.createCommonConnection(MQConnectionFactory.java:6215)
at com.ibm.mq.jms.MQQueueConnectionFactory.createQueueConnection(MQQueueConnectionFactory.java:120)
Вот мой соответствующий Java-код для чтения файла хранилища ключей и доверенных сертификатов как InputStream, и ошибка произошла, когда был вызван метод createQueueConnection.
InputStream keystoreInput = Thread.currentThread().getContextClassLoader().getResourceAsStream(keystoreFile);
InputStream truststoreInput = Thread.currentThread().getContextClassLoader().getResourceAsStream(trustStoreFile);
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
char[] keyPassword = keystorePassword.toCharArray();
keyStore.load(keystoreInput, keyPassword);
KeyManagerFactory keyFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
keyFactory.init(keyStore, keyPassword);
KeyManager[] keyManagers = keyFactory.getKeyManagers();
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
char[] trustPassword = trustStorePassword.toCharArray();
trustStore.load(truststoreInput, trustPassword);
TrustManagerFactory trustFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustFactory.init(trustStore);
TrustManager[] trustManagers = trustFactory.getTrustManagers();
SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(keyManagers, trustManagers, null);
SSLContext.setDefault(sslContext);
MQQueueConnectionFactory cf = ctx.getBean("mqIdsConnectionFactory", MQQueueConnectionFactory.class);
cf.setSSLSocketFactory((SSLSocketFactory) SSLSocketFactory.getDefault());
MQQueueConnection connection = (MQQueueConnection) cf.createQueueConnection();
Я проверил свой xml-файл, и все зависимости IBM MQ включены правильно, и я также могу найти файлы классов в uber jar. Это беспокоило меня в последние несколько дней, и если кто-нибудь знает, как это исправить, я был бы очень признателен за ваш вклад и предложения.
<dependency>
<groupId>com.ibm</groupId>
<artifactId>com.ibm.mq</artifactId>
<version>7.5.0</version>
</dependency>
<dependency>
<groupId>com.ibm</groupId>
<artifactId>com.ibm.mqjms</artifactId>
<version>7.5.0</version>
</dependency>
<dependency>
<groupId>com.ibm</groupId>
<artifactId>com.ibm.mq.headers</artifactId>
<version>7.5.0</version>
</dependency>
<dependency>
<groupId>com.ibm</groupId>
<artifactId>com.ibm.mq.jmqi</artifactId>
<version>7.5.0</version>
</dependency>
<dependency>
<groupId>com.ibm</groupId>
<artifactId>dhbcore</artifactId>
<version>7.5.0</version>
</dependency>
<dependency>
<groupId>com.ibm.jsse2</groupId>
<artifactId>ibmjsseprovider2</artifactId>
<version>7.5.0</version>
</dependency>
<dependency>
<groupId>com.ibm.security</groupId>
<artifactId>ibmjcefw</artifactId>
<version>7.5.0</version>
</dependency>
<dependency>
<groupId>com.ibm.crypto</groupId>
<artifactId>ibmjceprovider</artifactId>
<version>7.5.0</version>
</dependency>
<dependency>
<groupId>com.ibm.security</groupId>
<artifactId>ibmcertpathprovider</artifactId>
<version>7.5.0</version>
</dependency>
<dependency>
<groupId>com.ibm.security</groupId>
<artifactId>ibmpkcs</artifactId>
<version>7.5.0</version>
</dependency>
<dependency>
<groupId>com.ibm</groupId>
<artifactId>connector</artifactId>
<version>7.5.0</version>
</dependency>
1 ответ
Убедитесь, что вы не извлекаете зависимости внутри фляги, а просто включаете их, как указано в комментариях. Если вы экспортируете из затмения, есть возможность выбора радио.