SpringBoot直连SAP,IJ IDEA开发与Windows,linux部署

一、sapjco引入

1.1、sapjco介绍

  1. sapjco3.jar,连接SAP所需的jar包,linux与windows系统通用
  2. libsapjco3.so,linux系统下连接sap所需的动态链接库
  3. sapjeco3.dll,windows系统下连接sap所需的动态链接库
  • 我使用的版本为sapjco3.0.10
<dependency>
    <groupId>com.sap</groupId>
	<artifactId>sapjco3</artifactId>
	<version>3.0.10</version>
	<scope>system</scope>
	<systemPath>${project.basedir}/lib/sapjco3.jar</systemPath>
</dependency>

1.2、libsapjco3.sosapjeco3.dll 放入resources文件夹

  • 经过测试,链接库最佳放入地点就是放在resources文件夹下,这样可以不用配置<resources>标签就可package打包部署发布

二、IJ IDEA 开发时使用方式

2.1Maven项目下的sapjco3.jar配置

  • pom.xml下引入sapjco3.jar,sapjco3.jar可以放在任意目录,引入正确即可,例如我在项目主目录下新建个lib目录存放,dependency引入方式见1.1

  • 引入成功之后,自动生效

三、Windows环境部署

SpringBoot开发打包的jar,想要java -jar xxx.jar在Windows下运行成功,需要把sapjco3.dll放入%JAVA_HOME%\bin的目录下才能直连SAP成功

3.1、sapjco3.dll放入jdk\bin目录

jdk安装目录:E:\Program Files\Java\jdk1.8.0_201
把sapjco3.dll复制到E:\Program Files\Java\jdk1.8.0_201\bin下 

放入完毕后,重启项目即可

四、Linux环境部署

同windows一样,想要java -jar xxx.jar成功,需要配置链接库,但linux需要把libsapjco3.so,sapjco.jar均加载进入jdk目录才可

4.1、libsapjco3.so,sapjco.jar放入jdk

我的java安装目录为/usr/java/jdk1.8.0_111

libsapjco3.so放入目录 /usr/java/jdk1.8.0_111/jre/lib/amd64/server
sapjco3.jar放入目录 /usr/java/jdk1.8.0_111/jre/lib

4.2、配置环境变量

  • 打开 /etc/profile 文件,配置如下参数,放置文件末尾即可
export CLASSPATH=/usr/java/jdk1.8.0_111/jre/libsapjco3.jar
export LD_LIBRARY_PATH=/usr/java/jdk1.8.0_111/jre/lib/amd64/server
  • 执行 source /etc/profile  命令,使环境变量配置生效,然后重启项目即可

五、直连SAP代码开发 

5.1、pom.xml配置

<!-- 引入sapjco3.jar -->
<dependency>
   <groupId>com.sap</groupId>
   <artifactId>sapjco3</artifactId>
   <version>3.0.10</version>
   <scope>system</scope>
   <systemPath>${project.basedir}/lib/sapjco3.jar</systemPath>
</dependency>
<!-- 配置includeSystemScope为true,表示打包时,把本地的system的jar打入 -->
<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <includeSystemScope>true</includeSystemScope>
    </configuration>
</plugin>

5.2、代码示例 

import com.sap.conn.jco.*;
import com.sap.conn.jco.ext.DestinationDataProvider;
import org.springframework.stereotype.Component;

import java.io.File;
import java.io.FileOutputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

/**
 * 与SAP连接配置
 *
 * @author lixn_90
 */
@Component
public class SAPConn {
    private static final String ABAP_AS_POOLED = "ABAP_AS_WITH_POOL";
    private static Properties connectProperties = new Properties();

    static {
        //SAP系统配置,以下配置均为SAP提供
        //主机地址
        connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST, "127.0.0.1");
        //系统编号
        connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR, "00");
        //客户端
        connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, "123");
        //用户名
        connectProperties.setProperty(DestinationDataProvider.JCO_USER, "TEST");
        //密码
        connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, "TEST_PWD");
        //登入语言
        connectProperties.setProperty(DestinationDataProvider.JCO_LANG, "EN");
        //最大空闲连接数
        connectProperties.setProperty(DestinationDataProvider.JCO_POOL_CAPACITY, "2");
        //最大活动链接数
        connectProperties.setProperty(DestinationDataProvider.JCO_PEAK_LIMIT, "20");
    }

    /**
     * 创建SAP接口属性文件。
     *
     * @param name       ABAP管道名称
     * @param suffix     属性文件后缀
     * @param properties 属性文件内容
     */
    public static void createDataFile(String name, String suffix, Properties properties) {
        File cfg = new File(name + "." + suffix);
        try {
            if (cfg.exists()) {
                cfg.deleteOnExit();
            }
            FileOutputStream fos = new FileOutputStream(cfg, false);
            properties.store(fos, "for tests only !");
            fos.close();
        } catch (Exception e) {
            throw new RuntimeException("Unable to create the destination file " + cfg.getName(), e);
        }
    }

    /**
     * 获取SAP连接
     *
     * @return SAP连接对象
     */
    public static JCoDestination connect() {
        JCoDestination destination = null;
        try {
            destination = JCoDestinationManager.getDestination(ABAP_AS_POOLED);
            destination.ping();
        } catch (JCoException e) {
            e.printStackTrace();
        }
        return destination;
    }

    /**
     * 请求SAP
     *
     * @param param 请求内容
     * @return SAP返回内容
     */
    public static String requestSap(String param) {
        //SAP返回结果内容
        String sapReturnResult = "";
        //SAP方法名
        String functionName = "SAP_TEST_METHOD_01";
        //SAP提供的请求参数Key
        String requestKey = "IV_INPUT";
        //SAP提供的返回结果Key
        String resultKey = "CV_OUTPUT";
        //SAP传入参数集合
        Map<String, String> queryMap = new HashMap<>();
        queryMap.put(requestKey, param);
        try {
            JCoDestination destination = SAPConn.connect();
            JCoFunction function = destination.getRepository().getFunction(functionName);
            for (Map.Entry<String, String> entry : queryMap.entrySet()) {
                function.getImportParameterList().setValue(entry.getKey(), entry.getValue());
            }
            // 执行调用
            function.execute(destination);
            JCoParameterList exportParam = function.getExportParameterList();
            //获取单条数据
            sapReturnResult = exportParam.getString(resultKey);
        } catch (JCoException e) {
            e.printStackTrace();
        }
        return sapReturnResult;
    }

    /**
     * 访问测试
     *
     * @param args
     */
    public static void main(String[] args) {
        String result = requestSap("test");
        System.out.println("result = " + result);
    }
}

六、注意事项

6.1、sapjco带版本号直接打入jar

includeSystemScope设置为true即可

<includeSystemScope>true</includeSystemScope>

6.2、sapjco不带版本号打入jar

  • includeSystemScope设置为false,取消本地的system的jar打入
<includeSystemScope>false</includeSystemScope>
  • 利用<resources>标签打入
<resources>
    <resource>
        <directory>${project.basedir}/lib</directory>
        <targetPath>BOOT-INF/lib/</targetPath>
        <includes>
            <include>**/*.jar</include>
        </includes>
    </resource>
</resources>

6.3、打包libsapjco3.so、sapjco3.dll文件至jar

<resource>
    <directory>${project.basedir}/lib</directory>
    <targetPath>BOOT-INF</targetPath>
    <filtering>true</filtering>
    <includes>
        <include>**/*.so</include>
        <include>**/*.dll</include>
    </includes>
</resource>

6.4、pom的resources疑问(未完美解决)

  1. 配置resource,会导致idea启动失败,但是打包的jar可运行
  2. 不配置resource,idea运行成功,但是打包的jar无法运行,.so文件不能打包到BOOT-INF目录下
<resources>
    <resource>
        <directory>${project.basedir}/lib</directory>
        <targetPath>BOOT-INF/lib/</targetPath>
        <includes>
            <include>**/*.jar</include>
        </includes>
    </resource>
    <resource>
        <directory>${project.basedir}/lib</directory>
        <targetPath>BOOT-INF</targetPath>
        <filtering>true</filtering>
        <includes>
            <include>**/*.so</include>
            <include>**/*.dll</include>
        </includes>
    </resource>
    <resource>
        <directory>${project.basedir}/src/main/resources</directory>
        <targetPath>BOOT-INF/classes/</targetPath>
        <filtering>true</filtering>
    </resource>
</resources>
  • 未曾完美解决,目前想要保留resources配置,就只能在idea开发启动时,注释掉
  • package打包成jar时解开注释,打包后部署发布
  • 所以目前最佳方式,就是把 libsapjco3.sosapjeco3.dll 放入resources文件夹,不配置任何resource,使用springBoot默认配置打包
### IntelliJ IDEA 配置连接 MySQL 数据库教程 #### 准备工作 为了使 IntelliJ IDEA 能够顺利连接到 MySQL 数据库,需先确保已下载并准备好 `mysql-connector-java` 的 JAR 文件。此文件可以从官方网站获取,并将其导入至项目中[^1]。 对于 Maven 项目而言,在项目的 `pom.xml` 文件内添加如下依赖项来引入驱动程序: ```xml <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.49</version> </dependency> </dependencies> ``` #### 创建数据源 启动 IntelliJ IDEA 后进入数据库工具窗口,通过点击【Database】选项卡中的加号按钮(+),选择【Data Source】下的【MySQL】创建新的 MySQL 数据源[^2]。 填写必要的数据库连接参数,包括但不限于主机名、端口、用户名以及密码等信息。完成这些设置之后,记得点击页面下方的【Go to Driver】链接确认选用合适的 JDBC 驱动版本。 #### 测试连接 当所有配置都已完成以后,务必利用界面上提供的【Test Connection】功能验证能否正常建立目标数据库之间的通信链路。如果一切无误,则表明已经成功建立了从开发环境到数据库服务器的有效路径。 需要注意的是,不同版本间的兼容性问题可能导致某些特定情况下遇到异常情况。例如,使用较新版本的 mysql-connector-java (如 8.x 版本) 可能会因为类加载器找不到对应的驱动实现而导致运行失败;同样地,旧版也可能存在类似的不匹配状况。因此建议根据实际情况调整使用的驱动版本以确保最佳适配效果[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值