前言

本文例子来源于某个业务团队,本文次要记录在帮助他们部署接入sap遇到的问题,且只记录解决问题的答案,不阐明原理。

问题实录

1、问题一:Illegal JCo archive "sapjco-1.0.jar". It is not allowed to rename or repackage the original archive "sapjco3.jar"

解决方案一:手动我的项目中将sapjco-1.0.jar重名为sapjco3.jar

不过咱们没采纳这种计划

解决方案二:指定maven的scope为system,形如下
 <dependency>            <groupId>com.sap</groupId>            <artifactId>sapjco</artifactId>            <version>${sap.version}</version>            <scope>system</scope>            <systemPath>${project.basedir}/lib/sapjco3.jar</systemPath>        </dependency>

而后指定resources,形如下

<build>        <plugins>            <plugin>                <groupId>org.springframework.boot</groupId>                <artifactId>spring-boot-maven-plugin</artifactId>                <version>${spring-boot.version}</version>                <executions>                    <execution>                        <goals>                            <goal>repackage</goal>                        </goals>                    </execution>                </executions>            </plugin>            <plugin>                <artifactId>maven-compiler-plugin</artifactId>                <configuration>                    <source>1.8</source>                    <target>1.8</target>                    <encoding>UTF-8</encoding>                    <compilerArguments>                        <extdirs>${project.basedir}/lib</extdirs>                    </compilerArguments>                </configuration>            </plugin>        </plugins>        <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>                <includes>                    <include>**/*.so</include>                    <include>**/*.dll</include>                </includes>            </resource>            <resource>                <directory>src/main/resources</directory>                <!--<targetPath>BOOT-INF/classes/</targetPath>-->                <includes>                    <include>**/*.yml</include>                    <include>**/*.xml</include>                </includes>            </resource>        </resources>    </build>

这个的作用是将sapjco3.jar打进BOOT-INF/lib/

问题二:java.lang.UnsatisfiedLinkError: no sapjco3 in java.library.path

因为我的项目是部署到docker外面去,因而本文只写基于docker的解决方案

解决方案如下:

在dockerFile外面指定LD_LIBRARY_PATH环境变量,形如下

FROM adoptopenjdk/openjdk8VOLUME /tmp#ENV JAVA_OPTS="-Dcom.sun.management.jmxremote.port=39083 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"ENV JAVA_OPTS=""ENV LD_LIBRARY_PATH /usr/local/lib:$LD_LIBRARY_PATHCOPY localtime /etc/localtimeRUN echo "Asia/Shanghai" > /etc/timezoneCOPY hello-biz/target/hello-biz-*.jar app.jarCOPY hello-biz/lib/libsapjco3.so /usr/local/lib/libsapjco3.soENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]

总结

原本不想写这篇,但从业务团队那边理解到,他们过后百度了很久都没找到适合的答案。因而就记录下这篇文章,看下是否对有遇到此问题的敌人提供一点解决思路