1. 程式人生 > >(一)通過JAVA連線SAP (sapjco3.jar在Windows和MacOS上的配置)

(一)通過JAVA連線SAP (sapjco3.jar在Windows和MacOS上的配置)

(一)通過JAVA連線SAP呼叫介面 (sapjco3.jar在Windows和MacOS上的配置)

一、sapjoc3.jar獲取

由於sap官網提供的連結需要合作公司提供賬號密碼,如果商用請索要正確的使用者名稱密碼下載,如果只是想做測試使用,可以使用我這裡提供的連結,資源失效請及時提醒我,謝謝

點選這裡下載windows版 密碼:1u0t

點選這裡下載linux版 密碼:7zuv

點選這裡下載macOS版 密碼:lafl

二、測試專案環境準備

  1. 新建專案
    這個就不多談了,直接上圖,我這裡新建了一個空的測試專案,新建lib資料夾,準備把需要用到的jar包丟進來

  2. windows和macOS環境配置

    1. windows
      直接把 sapjco3.jar sapjco3.dll sapjco3.pdb 拷貝至lib下,然後add library把他們都新增進去
    2. macOS
      把 sapjco3.jar 和 libsapjco3.jnilib 拷貝至lib下,同樣add libray新增進去,這裡只需要add sapjco3.jar 即可。

WARNING: 這裡很多部落格講到需要新增classpath在變數裡面,這是參照了官方提供的安裝方式,這裡的話我們只需要將上述檔案拷貝至lib資料夾下即可

三、原始碼編寫及測試

首先編寫用來放置sap連線資訊的SapConn實體類

SapConn

  

/**
 * Created by [email protected] on 2018/12/6
 */
public class SapConn {

    // SAP伺服器
    private String JCO_ASHOST;
    // SAP系統編號
    private String JCO_SYSNR;
    // SAP集團
    private String JCO_CLIENT;
    // SAP使用者名稱
    private String JCO_USER;
    // SAP密碼
    private String JCO_PASSWD;
    
// SAP登入語言 private String JCO_LANG; // 最大連線數 private String JCO_POOL_CAPACITY; // 最大連線執行緒 private String JCO_PEAK_LIMIT; // SAP ROUTER private String JCO_SAPROUTER; public SapConn(String JCO_ASHOST, String JCO_SYSNR, String JCO_CLIENT, String JCO_USER, String JCO_PASSWD, String JCO_LANG, String JCO_POOL_CAPACITY, String JCO_PEAK_LIMIT, String JCO_SAPROUTER) { this.JCO_ASHOST = JCO_ASHOST; this.JCO_SYSNR = JCO_SYSNR; this.JCO_CLIENT = JCO_CLIENT; this.JCO_USER = JCO_USER; this.JCO_PASSWD = JCO_PASSWD; this.JCO_LANG = JCO_LANG; this.JCO_POOL_CAPACITY = JCO_POOL_CAPACITY; this.JCO_PEAK_LIMIT = JCO_PEAK_LIMIT; this.JCO_SAPROUTER = JCO_SAPROUTER; } public SapConn() {} public String getJCO_ASHOST() { return JCO_ASHOST; } public void setJCO_ASHOST(String JCO_ASHOST) { this.JCO_ASHOST = JCO_ASHOST; } public String getJCO_SYSNR() { return JCO_SYSNR; } public void setJCO_SYSNR(String JCO_SYSNR) { this.JCO_SYSNR = JCO_SYSNR; } public String getJCO_CLIENT() { return JCO_CLIENT; } public void setJCO_CLIENT(String JCO_CLIENT) { this.JCO_CLIENT = JCO_CLIENT; } public String getJCO_USER() { return JCO_USER; } public void setJCO_USER(String JCO_USER) { this.JCO_USER = JCO_USER; } public String getJCO_PASSWD() { return JCO_PASSWD; } public void setJCO_PASSWD(String JCO_PASSWD) { this.JCO_PASSWD = JCO_PASSWD; } public String getJCO_LANG() { return JCO_LANG; } public void setJCO_LANG(String JCO_LANG) { this.JCO_LANG = JCO_LANG; } public String getJCO_POOL_CAPACITY() { return JCO_POOL_CAPACITY; } public void setJCO_POOL_CAPACITY(String JCO_POOL_CAPACITY) { this.JCO_POOL_CAPACITY = JCO_POOL_CAPACITY; } public String getJCO_PEAK_LIMIT() { return JCO_PEAK_LIMIT; } public void setJCO_PEAK_LIMIT(String JCO_PEAK_LIMIT) { this.JCO_PEAK_LIMIT = JCO_PEAK_LIMIT; } public String getJCO_SAPROUTER() { return JCO_SAPROUTER; } public void setJCO_SAPROUTER(String JCO_SAPROUTER) { this.JCO_SAPROUTER = JCO_SAPROUTER; } @Override public String toString() { return "SapConn{" + "JCO_ASHOST='" + JCO_ASHOST + '\'' + ", JCO_SYSNR='" + JCO_SYSNR + '\'' + ", JCO_CLIENT='" + JCO_CLIENT + '\'' + ", JCO_USER='" + JCO_USER + '\'' + ", JCO_PASSWD='" + JCO_PASSWD + '\'' + ", JCO_LANG='" + JCO_LANG + '\'' + ", JCO_POOL_CAPACITY='" + JCO_POOL_CAPACITY + '\'' + ", JCO_PEAK_LIMIT='" + JCO_PEAK_LIMIT + '\'' + ", JCO_SAPROUTER='" + JCO_SAPROUTER + '\'' + '}'; } }

 

然後編寫用來建立sap連線的SapConn作為連線類

編寫連線類SAPConnUtils 下面是原始碼

/**
 * Created by [email protected] on 2018/12/4
 */
public class SAPConnUtils {

    private static final String ABAP_AS_POOLED = "ABAP_AS_WITH_POOL";

    /**
     * 建立SAP介面屬性檔案。
     * @param name  ABAP管道名稱
     * @param suffix    屬性檔案字尾
     * @param properties    屬性檔案內容
     */
    private static void createDataFile(String name, String suffix, Properties properties){
        File cfg = new File(name+"."+suffix);
        if(cfg.exists()){
            cfg.deleteOnExit();
        }
        try{
            FileOutputStream fos = new FileOutputStream(cfg, false);
            properties.store(fos, "for tests only !");
            fos.close();
        }catch (Exception e){
            System.out.println("Create Data file fault, error msg: " + e.toString());
            throw new RuntimeException("Unable to create the destination file " + cfg.getName(), e);
        }
    }

    /**
     * 初始化SAP連線
     */
    private static void initProperties(SapConn sapConn) {
        Properties connectProperties = new Properties();
        // SAP伺服器
        connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST, sapConn.getJCO_ASHOST());
        // SAP系統編號
        connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR,  sapConn.getJCO_SYSNR());
        // SAP集團
        connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, sapConn.getJCO_CLIENT());
        // SAP使用者名稱
        connectProperties.setProperty(DestinationDataProvider.JCO_USER,   sapConn.getJCO_USER());
        // SAP密碼
        connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, sapConn.getJCO_PASSWD());
        // SAP登入語言
        connectProperties.setProperty(DestinationDataProvider.JCO_LANG,   sapConn.getJCO_LANG());
        // 最大連線數
        connectProperties.setProperty(DestinationDataProvider.JCO_POOL_CAPACITY, sapConn.getJCO_POOL_CAPACITY());
        // 最大連線執行緒
        connectProperties.setProperty(DestinationDataProvider.JCO_PEAK_LIMIT, sapConn.getJCO_PEAK_LIMIT());
        // SAP ROUTER
        connectProperties.setProperty(DestinationDataProvider.JCO_SAPROUTER, sapConn.getJCO_SAPROUTER());

        createDataFile(ABAP_AS_POOLED, "jcoDestination", connectProperties);
    }

    /**
     * 獲取SAP連線
     * @return  SAP連線物件
     */
    public static JCoDestination connect(SapConn sapConn){
        System.out.println("正在連線至SAP...");
        JCoDestination destination = null;
        initProperties(sapConn);
        try {
            destination = JCoDestinationManager.getDestination(ABAP_AS_POOLED);
            destination.ping();
            System.out.println("已成功建立sap的連線");
        } catch (JCoException e) {
            System.out.println("Connect SAP fault, error msg: " + e.toString());
        }
        return destination;
    }

}

 

接下來編寫一個簡單的測試類test

/**
 * Created by [email protected] on 2018/12/9
 */
public class testCon {

    public static void main(String[] args) {

        SapConn con = new SapConn(
                "127.0.0.1",
                "123",
                "456",
                "abc",
                "abc",
                "abc",
                "123",
                "321",
                "123456"
        );

        // 測試連線
        SAPConnUtils.connect(con);
    }
}

 

如果出現如下結果表明連線失敗,請檢查連線類。

此時如果呼叫結果如下則表明建立連線成功。

四、常見報錯

  1. 缺少build path

    這個錯誤是因為缺少了上述提到的檔案,請按照文中提到的順序將其加入專案中即可。