2016-11-11 135 views
1

我們有一個使用DropWizard製作的Java項目,該項目使用庫SAP JCO和SAP IDOC,當它從IDE運行時不會引發任何錯誤,但是當它被打包成一個罐子,我們試圖在我們收到以下堆棧跟蹤的jar:運行應用程序時出現「服務器默認存儲庫目標XXXX無效」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 

當我們運行jar,我們做這樣的:

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

目標和服務器的份額,因爲我們的Java應用程序發送和從ERP接收的IDocs同一個節目ID,我們使用的IntelliJ作爲一個IDE並從那裏運行應用程序不會拋出任何錯誤並按預期工作。

是否有這個問題的已知原因?在IDE外部運行jar時,它是否需要特定的參數才能運行?如何不能創建目標代理消息涉及到NoSuchAlgorithmException錯誤?

回答

3

設置java.ext.dirs打破了Java加密,因爲(大多數)提供程序在擴展罐。

「添加到應用」罐子應該在類路徑中(但-jar他們在清單不是命令行來進行設置)和「添加到系統」罐子通常應在一個放(複製或符號鏈接) JVM的標準位置which vary by platform and install。如果你真的必須使用你自己的目錄ext.dirs你需要加到不能取代平臺相關的默認值。

+0

我們在文件夾lib中放置了sapjco和sapidoc庫,我們被告知我們不能在我們的jar中分發,所以我們應該如何繼續?我們是否必須添加對清單或其他地方的引用? –

+0

我想說一句,我們的項目依賴性是用Maven處理的,所以這也可能是問題的一部分? –

+0

@UrielArvizu:如果你想在任何地方運行你的應用程序,那麼使用應用程序進行安裝並將它們的相對路徑放在Class-path中:在manifest中是官方的方式。我不知道maven以及它是如何產生清單的;我希望它在文檔中,並且可能已經有一個Q了。如果你只想在一臺或幾臺機器上運行,並且你有權訪問並且lib jar不會有太大變化,那麼將它們放入JRE或「site」目錄中,然後按照我的鏈接進行操作是合理的,然後他們'自動'可用於所有應用程序。 –

相關問題