Ошибка "Серверное хранилище по умолчанию XXXX неверно" при запуске JAR приложения

У нас есть Java-проект, созданный с помощью DropWizard, который использует библиотеки SAP JCO и SAP IDOC, при запуске из IDE он не выдает никакой ошибки, но когда он упакован в банку и мы пытаемся запустить банку, мы получаем следующее трассировки стека:

com.sap.conn.jco.JCoException: (106) JCO_ERROR_RESOURCE: Server default repository destination AGENT is invalid: Destination AGENT could not be created: java.lang.Error: java.security.NoSuchAlgorithmException: AES KeyGenerator not available
        at com.sap.conn.jco.rt.DefaultServer.update(DefaultServer.java:240)
        at com.sap.conn.jco.rt.DefaultServer.<init>(DefaultServer.java:117)
        at com.sap.conn.idoc.jco.rt.DefaultJCoIDocServer.<init>(DefaultJCoIDocServer.java:47)
        at com.sap.conn.idoc.jco.rt.DefaultJCoIDocServerFactory.createServer(DefaultJCoIDocServerFactory.java:17)
        at com.sap.conn.idoc.jco.rt.DefaultJCoIDocServerFactory.createServer(DefaultJCoIDocServerFactory.java:13)
        at com.sap.conn.jco.rt.DefaultServerManager.getServer(DefaultServerManager.java:104)
        at com.sap.conn.jco.rt.StandaloneServerFactory.update(StandaloneServerFactory.java:362)
        at com.sap.conn.jco.rt.StandaloneServerFactory.getServerInstance(StandaloneServerFactory.java:175)
        at com.sap.conn.idoc.jco.JCoIDoc.getServer(JCoIDoc.java:301)
        at com.enapsys.dw.bundles.sapidoc.api.SAPIdocServerListener.run(SAPIdocServerListener.java:38)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)
Caused by: com.sap.conn.jco.JCoException: (106) JCO_ERROR_RESOURCE: Destination AGENT could not be created: java.lang.Error: java.security.NoSuchAlgorithmException: AES KeyGenerator not available
        at com.sap.conn.jco.rt.DefaultDestinationManager.update(DefaultDestinationManager.java:219)
        at com.sap.conn.jco.rt.DefaultDestinationManager.searchDestination(DefaultDestinationManager.java:383)
        at com.sap.conn.jco.rt.DefaultDestinationManager.getDestinationInstance(DefaultDestinationManager.java:99)
        at com.sap.conn.jco.JCoDestinationManager.getDestination(JCoDestinationManager.java:104)
        at com.sap.conn.jco.rt.DefaultServer.update(DefaultServer.java:218)
        ... 12 more
Caused by: java.lang.Error: java.security.NoSuchAlgorithmException: AES KeyGenerator not available
        at com.sap.conn.jco.util.Codecs$AES.generateSecretKey(Codecs.java:1020)
        at com.sap.conn.rfc.engine.GUID.<clinit>(GUID.java:62)
        at com.sap.conn.jco.rt.JCoRuntime.createSecureString(JCoRuntime.java:1344)
        at com.sap.conn.jco.rt.DefaultDestinationManager.checkAndCopyProperties(DefaultDestinationManager.java:549)
        at com.sap.conn.jco.rt.DefaultDestinationManager.getProperties(DefaultDestinationManager.java:345)
        at com.sap.conn.jco.rt.DefaultDestinationManager.update(DefaultDestinationManager.java:171)
        ... 16 more
Caused by: java.security.NoSuchAlgorithmException: AES KeyGenerator not available
        at javax.crypto.KeyGenerator.<init>(KeyGenerator.java:169)
        at javax.crypto.KeyGenerator.getInstance(KeyGenerator.java:223)
        at com.sap.conn.jco.util.Codecs$AES.generateSecretKey(Codecs.java:1015)
        ... 21 more

Наш файл.jcoServer выглядит так:

jco.server.progid=AGENT
jco.server.name=MYSERVER
jco.server.gwhost=xx.xx.xx.xx
jco.server.gwserv=xxxx
jco.server.connection_count=1
jco.server.repository_destination=AGENT

Наш файл.jcoDestination выглядит так:

jco.client.type=3
jco.client.client=001
jco.client.user=xxxxxx
jco.client.passwd=xxxxxx
jco.client.lang=en
jco.client.ashost=xxxxxxxx
jco.client.sysnr=00
jco.client.trace=0
jco.destination.repository_destination=AGENT

Когда мы запускаем флягу, мы делаем это так:

java -jar -Djava.ext.dirs=lib agent.jar server applicationConfiguration.yml

Назначение и сервер совместно используют один и тот же идентификатор программы, так как наше приложение Java отправляет и получает iDocs из ERP, мы используем IntelliJ в качестве IDE, и запуск приложения оттуда не выдает никакой ошибки и работает, как ожидалось.

Есть ли известная причина этой проблемы? При запуске jar вне среды IDE требуется ли для запуска определенный параметр? Как целевое АГЕНТ не смог создать сообщение, относящееся к ошибке NoSuchAlgorithmException?

1 ответ

Решение

Настройка java.ext.dirsсломал Java crypto, потому что (большинство) провайдеров находятся в банках расширений.

Банки "Добавить в приложение" должны быть в classpath (но с -jar они должны быть заданы в манифесте, а не в командной строке), а баночки "добавить в систему" ​​обычно должны быть помещены (скопированы или связаны символами) в одно из стандартных мест JVM, которые различаются в зависимости от платформы и установки. Если вы действительно должны использовать свой собственный каталог в ext.dirs Вы должны добавить, чтобы не заменить платформо-зависимый по умолчанию.

Другие вопросы по тегам