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環境)

關於SAP sapjco3遠程調用失敗_sapjco3.dll_jar包

  • 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” 了。