当前位置: 代码网 > it编程>编程语言>Java > SpringBoot集成SAP的过程及本地IDEA启动和Windows服务器部署

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

2025年07月17日 Java 我要评论
网上有关springboot集成sap有各种各样的说法,我这里提供一个我调通的方案。如下pom配置,sapjco3.dll 放在"%java_home%\bin\",否则报nest

网上有关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内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com