dataworks平台的ODPS Spark配置java腳本調sap接口引用sapjco3.jar報錯問題
問題背景
- 由於業務要求,需要在阿里雲dataworks數據開發平台的ODPS Spark配置java腳本調sap接口,調研後發現需要引入sapjco.jar。
- 然而在dataworks - MaxCompute - ODPS Spark上傳的所有資源文件在運行時都會被系統強制重命名(可能出於文件安全考慮)
- sapjco.jar在3.0.11版本及後續版本都要求jar包名不許更改,否則報如下錯誤
java.lang.ExceptionInInitializerError:
JCo initialization failed with java.lang.ExceptionInInitializerError:
Illegal JCo archive "3e26b5c60c80352bbc90eef4e35aebea.jar".
It is not allowed to rename or repackage the original archive "sapjco3.jar".
報錯信息可以看出該jar包是不允許重命名的,哪怕帶了版本號(比如:sapjco-3.0.17.jar)也會報錯。該文章為此問題解決方案。
本地調試
- 先去官網下載對應的資源包,並把三個文件放在lib目錄下
sapjco3.jar
sapjco3.dll (windows環境)
libsapjco3.so (linux環境)
- maven配置本地包加載,我這裏用的是3.0.17版本
<dependency>
<groupId>com.sap</groupId>
<artifactId>sapjco3</artifactId>
<version>3.0.17</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/sapjco3.jar</systemPath>
</dependency>
配置好上述操作,即可在本地調試sap的調用。
打包步驟(該問題通過打包解決)
由於sapjco.jar不允許重命名包,所以想着是把該包做成內嵌jar包的形式,然後動態加載內嵌的sapjco.jar,在網上調研了多種打包方式,最後選擇用one-jar插件加手動改包名的操作。
- 第一步:把本地的sapjco.jar安裝到本地mvn庫,命令如下
注意:有的參數值如果有“.”,需要把整個參數值用雙引號包裹,如下方命令
mvn install:install-file -Dfile="lib\sapjco3.jar" -DgroupId="com.sap" -DartifactId=sapjco3 -Dversion="3.0.17" -Dpackaging=jar
- 第二步:修改pom.xml配置
註釋掉本地調試的引包方式,替換成下面的方式,看能否從本地mvn庫引入
(此種方式不能在本地調試,因為引入的包名為sapjco3-3.0.17.jar會報錯,此步驟僅為打包前置步驟)
<dependency>
<groupId>com.sap</groupId>
<artifactId>sapjco3</artifactId>
<version>3.0.17</version>
</dependency>
- 第三步:引入打包工具one-jar,並打包
one-jar打包工具會把所有依賴內嵌到主jar中(包括當前業務代碼),然後生成one-jar自己的代碼(此代碼代理業務代碼,目的是在執行業務代碼前加載所有的內嵌jar包依賴),以下為pom中one-jar打包工具的配置。
<plugin>
<groupId>com.jolira</groupId>
<artifactId>onejar-maven-plugin</artifactId>
<version>1.4.4</version>
<executions>
<execution>
<configuration>
<onejarVersion>0.97</onejarVersion>
<attachToBuild>true</attachToBuild>
<filename>${project.build.finalName}-onejar.${project.packaging}</filename>
<classifier>onejar</classifier>
<mainClass>你自己項目的主類</mainClass>
</configuration>
<goals>
<goal>one-jar</goal>
</goals>
</execution>
</executions>
</plugin>
- 第四步:修改jar包中sapjco的命名
打好的包用解壓工具打開,目錄結構如下圖
src是one-jar生成的代理代碼
com是src編譯後的class文件
main是業務jar包
lib下是所有的依賴
打開lib,找到sapjco帶版本號的包並重命名 - 第五步:上傳文件並填寫相關配置
Main Class:填 OneJar 這個類是one-jar生成的代理類,裏面的main方法依次執行了內嵌jar的加載以及打包時指定的業務main類的main方法
file資源:選上libsapjco.so,因為linux環境運行時需要這個類庫
總結
通過上述幾步,在dataworks平台的ODPS Spark配置java腳本調sap接口引用sapjco3.jar就不會報 It is not allowed to rename or repackage the original archive “sapjco3.jar” 了。