运行 应用程序 JAR 时出现错误 "Server default repository destination XXXX is invalid"
Error "Server default repository destination XXXX is invalid" when running application JAR
我们有一个使用 SAP JCO 和 SAP IDOC 库的 DropWizard 制作的 Java 项目,当 运行 来自 IDE 时它不会抛出任何错误,但是当它被打包到一个 jar 中,我们尝试 运行 我们收到以下堆栈跟踪的 jar:
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
目标和服务器共享相同的程序 ID,因为我们的 Java 应用程序从 ERP 发送和接收 iDoc,我们使用 IntelliJ 作为 IDE 和 运行 从那里连接应用程序不会抛出任何错误并按预期工作。
此问题是否有已知原因?当 运行 在 IDE 之外安装 jar 时,它是否需要一个特定的参数到 运行? Destination AGENT could not be created 消息与 NoSuchAlgorithmException 错误有什么关系?
设置 java.ext.dirs
破坏了 Java 加密,因为(大多数)提供程序都在扩展 jar 中。
'Add to app' jars 应该 在类路径中(但是 -jar
它们必须在清单而不是命令行中设置)和 'add to system' jar 通常应该放在(复制或符号链接)JVM 的标准位置之一 which vary by platform and install。如果你真的必须在 ext.dirs
中使用你自己的目录,你需要 添加到 而不是替换依赖于平台的默认值。
我们有一个使用 SAP JCO 和 SAP IDOC 库的 DropWizard 制作的 Java 项目,当 运行 来自 IDE 时它不会抛出任何错误,但是当它被打包到一个 jar 中,我们尝试 运行 我们收到以下堆栈跟踪的 jar:
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
目标和服务器共享相同的程序 ID,因为我们的 Java 应用程序从 ERP 发送和接收 iDoc,我们使用 IntelliJ 作为 IDE 和 运行 从那里连接应用程序不会抛出任何错误并按预期工作。
此问题是否有已知原因?当 运行 在 IDE 之外安装 jar 时,它是否需要一个特定的参数到 运行? Destination AGENT could not be created 消息与 NoSuchAlgorithmException 错误有什么关系?
设置 java.ext.dirs
破坏了 Java 加密,因为(大多数)提供程序都在扩展 jar 中。
'Add to app' jars 应该 在类路径中(但是 -jar
它们必须在清单而不是命令行中设置)和 'add to system' jar 通常应该放在(复制或符号链接)JVM 的标准位置之一 which vary by platform and install。如果你真的必须在 ext.dirs
中使用你自己的目录,你需要 添加到 而不是替换依赖于平台的默认值。