SpringBoot集成SAP的过程及本地IDEA启动和Windows服务器部署

 更新时间:2025年07月17日 15:01:41   作者:乘风!  
本文给大家介绍SpringBoot集成SAP的过程及本地IDEA启动和Windows服务器部署的相关知识,本文给大家介绍的详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

网上有关Springboot集成SAP有各种各样的说法,我这里提供一个我调通的方案。如下pom配置,sapjco3.dll 放在"%JAVA_HOME%\bin\",否则报nested exception is java.lang.NoClassDefFoundError: Could not initialize class com.sap.conn.jco.JCo,服务器部署时也是这样放置,

sapjco3.dll和sapjco3.jar放在resources\lib下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.demo</groupId>
        <artifactId>OPM</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <groupId>com.demo</groupId>
    <artifactId>open-manager</artifactId>
    <packaging>jar</packaging>
    <name>open-manager</name>
    <description>open-manager</description>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>com.demo</groupId>
            <artifactId>common</artifactId>
            <!--不加版本无法引用-->
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.sapjco3</groupId>
            <artifactId>sapjco</artifactId>
            <version>3.0</version>
            <scope>system</scope>
            <systemPath>${pom.basedir}/src/main/resources/lib/sapjco3.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    </dependencies>
    <profiles>
        <!-- 本地环境 -->
        <profile>
            <id>local</id>
            <properties>
                <spring.profiles.active>local</spring.profiles.active>
            </properties>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
        <!-- 开发环境 -->
        <profile>
            <id>dev</id>
            <properties>
                <spring.profiles.active>dev</spring.profiles.active>
            </properties>
        </profile>
        <!-- 生产环境 -->
        <profile>
            <id>prod</id>
            <properties>
                <spring.profiles.active>prod</spring.profiles.active>
            </properties>
        </profile>
    </profiles>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <!--为false,取消本地的system的jar打入-->
                    <includeSystemScope>true</includeSystemScope>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>3.3.0</version>
            </plugin>
        </plugins>
        <resources>
            <resource>
                <directory>src/main/webapp</directory>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <!-- true表示利用占位符进行替换 -->
                <filtering>true</filtering>
                <includes>
                    <!--Maven 资源过滤是为文本文件设计的(如属性文件、XML 等)-->
                    <include>**/*.properties</include>
                    <include>application.yml</include>
                    <!-- ${spring.profiles.active}就是我们指定的环境,会被替换掉 -->
                    <include>application-${spring.profiles.active}.yml</include>
                    <include>**/*.xml</include>
                    <include>**/*.html</include>
                    <include>**/*.json</include>
                    <include>webapp/</include>
                </includes>
                <excludes>
                    <!-- 排除目录 -->
                    <exclude>lib/**</exclude>
                    <exclude>**/*.jar</exclude>
                    <exclude>**/*.dll</exclude> <!--sapjco3.dll "%JAVA_HOME%\bin\"-->
                    <exclude>**/*.jks</exclude>
                    <exclude>**/*.png</exclude>
                </excludes>
            </resource>
            <!-- 新增:单独处理二进制文件(不进行过滤) -->
            <resource>
                <directory>src/main/resources/lib</directory>
                <filtering>false</filtering>
                <targetPath>BOOT-INF/lib</targetPath>  <!-- 关键修改 -->
                <includes>
                    <include>sapjco3.jar</include>
                </includes>
            </resource>
            <!-- 处理其他资源 -->
            <resource>
                <directory>src/main/resources</directory>
                <filtering>false</filtering>
                <targetPath>BOOT-INF/classes</targetPath>
                <excludes>
                    <exclude>lib/**</exclude> <!-- 排除已单独处理的 lib 目录 -->
                </excludes>
                <includes>
                    <include>**/*.jks</include>
                    <include>**/*.png</include>
                </includes>
            </resource>
        </resources>
    </build>
</project>
package com.demo.openmanager.sap;
import com.demo.common.util.StringUtils;
import com.sap.conn.jco.JCoDestination;
import com.sap.conn.jco.JCoDestinationManager;
import com.sap.conn.jco.JCoException;
import com.sap.conn.jco.ext.DestinationDataProvider;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
@Slf4j
public class XpJco {
    @Value("${sap.host}")
    private String SAP_HOST;
    @Value("${sap.client}")
    private String SAP_CLIENT;
    @Value("${sap.sysno}")
    private String SAP_SYS_NO;
    @Value("${sap.user}")
    private String SAP_USER;
    @Value("${sap.pass}")
    private String SAP_PASS;
    @Value("${sap.lang}")
    private String SAP_LANG;
    @Value("${sap.poolCapacity}")
    private String SAP_POOL_CAPACITY;
    @Value("${sap.peakLimit}")
    private String SAP_PEAK_LIMIT;
    @Value("${sap.jcoSaprouter}")
    private String SAP_JCO_SAPROUTER;
    public synchronized JCoDestination getJCoDestination(String filename) {
        JCoDestination destination = null;
        try {
            destination = JCoDestinationManager.getDestination(filename);
        } catch (JCoException e) {
            e.printStackTrace();
        }
        return destination;
    }
    private static boolean creatSapPros(String filename, String host, String sysno, String client, String user, String pass,
                                        String lang, String pool_capacity, String peak_limit, String JCO_SAPROUTER) {
        Properties pros = new Properties();
        boolean iscreate = false;
        pros.clear(); // 先清空
        pros.setProperty(DestinationDataProvider.JCO_ASHOST, host);
        pros.setProperty(DestinationDataProvider.JCO_SYSNR, sysno);
        pros.setProperty(DestinationDataProvider.JCO_CLIENT, client);
        pros.setProperty(DestinationDataProvider.JCO_USER, user);
        pros.setProperty(DestinationDataProvider.JCO_PASSWD, pass);
        pros.setProperty(DestinationDataProvider.JCO_LANG, lang);
        pros.setProperty(DestinationDataProvider.JCO_POOL_CAPACITY, pool_capacity);
        pros.setProperty(DestinationDataProvider.JCO_PEAK_LIMIT, peak_limit);
        if (StringUtils.isNoneBlank(JCO_SAPROUTER)) {
            pros.setProperty(DestinationDataProvider.JCO_SAPROUTER, JCO_SAPROUTER);
        }
        iscreate = createFiles(filename, pros);
        if (iscreate) {
            return true;
        } else {
            return false;
        }
    }
    /**
     * @param filename
     * @return
     */
    private static boolean isFileExist(String filename) {
        File file = new File(filename + ".jcoDestination");
        log.info("JCO path:" + file.getPath());
        log.info("JCO AbsolutePath:" + file.getAbsolutePath());
        // 最后会放在Q:\IdeaWork\OPM\tz02_ywk_jco.jcoDestination
        // 环境上是放在启动jar包所在同级目录
        return file.exists();
    }
    /**
     * @param filename
     * @param pros
     * @return
     */
    private static boolean createFiles(String filename, Properties pros) {
        File file = new File(filename + ".jcoDestination");
        FileOutputStream fos = null;
        if (!file.exists()) {
            try {
                log.info("********* 正在写入文件 **********");
                fos = new FileOutputStream(file, false);
                pros.store(fos, "Author: ljb");
                fos.close();
                return true;
            } catch (FileNotFoundException e) {
                log.info("-------- 找不到文件! ---------");
                e.printStackTrace();
                return false;
            } catch (IOException e) {
                log.info("-------- 内容写入失败! ---------");
                e.printStackTrace();
                return false;
            } finally {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        } else {
            return false;
        }
    }
    public synchronized JCoDestination getJCoDestination() {
        boolean isexist = false; // 判断文件是否存在
        boolean isCreate = false; // 创建pro文件
        JCoDestination destination;
        String filename = "tz02_ywk_jco";
        isexist = XpJco.isFileExist(filename);
        log.info("-- 获取JCoDestination isexist==" + isexist);
        if (isexist == true) {
            try {
                destination = JCoDestinationManager.getDestination(filename);
                return destination;
            } catch (JCoException e) {
                log.info("-- 获取JCoDestination失敗! --");
                e.printStackTrace();
                return null;
            }
        } else {
            isCreate = XpJco.creatSapPros(filename, SAP_HOST, SAP_SYS_NO, SAP_CLIENT, SAP_USER, SAP_PASS, SAP_PASS,
                    SAP_POOL_CAPACITY, SAP_PEAK_LIMIT, SAP_JCO_SAPROUTER);
            if (isCreate == true) {
                try {
                    destination = JCoDestinationManager.getDestination(filename);
                    log.info("获取JCoDestination!成功");
                    return destination;
                } catch (JCoException e) {
                    log.info("无法获取JCoDestination!");
                    e.printStackTrace();
                    return null;
                }
            } else { // 如果文件不存在
                return null;
            }
        }
    }
}

到此这篇关于SpringBoot集成SAP,本地IDEA启动和Windows服务器部署的文章就介绍到这了,更多相关SpringBoot集成SAP内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 深入浅析Java Object Serialization与 Hadoop 序列化

    深入浅析Java Object Serialization与 Hadoop 序列化

    序列化是指将结构化对象转化为字节流以便在网络上传输或者写到磁盘永久存储的过程。下面通过本文给大家分享Java Object Serialization与 Hadoop 序列化,需要的朋友可以参考下
    2017-06-06
  • java中"==" 与equals方法的使用

    java中"==" 与equals方法的使用

    本篇文章介绍了,在java中"==" 与equals方法的使用。需要的朋友参考下
    2013-04-04
  • java关于Date日期类型的大小比较

    java关于Date日期类型的大小比较

    这篇文章主要介绍了java关于Date日期类型的大小比较,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • 浅谈ThreadLocal为什么会内存泄漏

    浅谈ThreadLocal为什么会内存泄漏

    这篇文章主要介绍了浅谈ThreadLocal为什么会内存泄漏,每个Thread内部维护着一个ThreadLocalMap,它是一个Map,这个映射表的Key是一个弱引用,其实就是ThreadLocal本身,Value是真正存的线程变量Object,需要的朋友可以参考下
    2023-12-12
  • java使用Abobe Acrobat DC生成模板

    java使用Abobe Acrobat DC生成模板

    这篇文章主要介绍了java使用Abobe Acrobat DC生成模板,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04
  • Spring实现Logback日志模板设置动态参数功能

    Spring实现Logback日志模板设置动态参数功能

    本文介绍如何在Spring应用中实现Logback日志模板的动态参数设置,通过设计traceId链路标识,将其动态添加到日志输出中,从而实现简易的链路追踪功能,感兴趣的朋友跟随小编一起看看吧
    2024-11-11
  • spring项目如何配置多数据源(已上生产,亲测有效)

    spring项目如何配置多数据源(已上生产,亲测有效)

    这篇文章主要介绍了spring项目如何配置多数据源(已上生产,亲测有效),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Mybatis分页插件PageHelper配置及使用方法详解

    Mybatis分页插件PageHelper配置及使用方法详解

    这篇文章主要介绍了Mybatis分页插件PageHelper配置及使用方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • java中几种常见的排序算法总结

    java中几种常见的排序算法总结

    大家好,本篇文章主要讲的是java中几种常见的排序算法总结,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • 详细聊一聊java中封装的那点事

    详细聊一聊java中封装的那点事

    封装是一个非常广泛的概念,小到一个属性的封装,大到一个框架或者一个项目的封装,下面这篇文章主要给大家介绍了关于java中封装的那点事,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04

最新评论